這道題在最短路方面沒什麼問題,主要是最後求出每一點到終點的最短路之後要使用記憶化搜索來尋找可以行走的路數
不多說直接上代碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 10000000//坑爹啊,這題的難點原來是記憶化搜索!!!!我還以爲不能用Dijkstra要用SPFA。。。。。。。。。
using namespace std;
int dis[1005],cost[1005][1005],judge[1005];
int sum[1005];
int n,m;
void Dijkstra()
{
fill(dis,dis+n+1,INF);
memset(judge,0,sizeof(judge));
dis[2]=0;
int x;
while(true)
{
x=-1;
for(int i=1;i<=n;i++)
{
if(judge[i]==0&&(x==-1||dis[i]<dis[x])) x=i;
}
if(x==-1) break;
judge[x]=1;
for(int i=1;i<=n;i++)
{
dis[i]=min(dis[i],dis[x]+cost[x][i]);
}
}
return;
}
int dfs(int x)
{
if(sum[x]!=0) return sum[x];
if(x==2) return 1;
for(int i=1;i<=n;i++)
{
if(dis[x]>dis[i]&&cost[i][x]!=INF)
{
sum[x]+=dfs(i);
}
}
return sum[x];
}
int main()
{
int point1,point2,value,ans;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d",&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cost[i][j]=INF;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&point1,&point2,&value);
cost[point1][point2]=cost[point2][point1]=value;
}
Dijkstra();
memset(sum,0,sizeof(sum));
ans=dfs(1);
printf("%d\n",ans);
}
return 0;
}