还是dijkstra算法 稍有变形 在长度相同的时候 更新人数和路径条数
注意 最后输出的是 最短路径的条数 是条数!
AC代码
1 #include <stdio.h> 2 #define MAX 1000000 3 4 int N,M,S,D; 5 int g[500][500]; 6 int dis[500]; 7 int cost[500]; 8 int cost1[500]; 9 int flag[500]; 10 int path[500]; 11 void Dijkstra(int v) 12 { 13 int min,i,j,pos; 14 cost[v]=cost1[v]; 15 path[v]=1; 16 dis[v]=0; 17 for(i=0;i<N;i++) 18 { 19 min=MAX; 20 for(j=0;j<N;j++) 21 { 22 if(flag[j]!=1 && dis[j]<min) 23 { 24 min=dis[j]; 25 pos=j; 26 } 27 } 28 flag[pos]=1; 29 for(j=0;j<N;j++) 30 { 31 if(flag[j]!=1) 32 { 33 if(dis[pos]+g[pos][j]<dis[j]) 34 { 35 dis[j]=dis[pos]+g[pos][j]; 36 cost[j]=cost[pos]+cost1[j]; 37 path[j]=path[pos]; 38 } 39 else if(dis[pos]+g[pos][j]==dis[j] ) 40 { 41 path[j] += path[pos]; 42 if(cost[j]<cost[pos]+cost1[j]) 43 cost[j]=cost[pos]+cost1[j]; 44 } 45 } 46 47 } 48 } 49 printf("%d %d\n",path[D],cost[D]); 50 } 51 main() 52 { 53 int a,b,l,c; 54 int i,j; 55 scanf("%d%d%d%d",&N,&M,&S,&D); 56 for(i=0;i<N;i++) 57 { 58 scanf("%d",&cost1[i]); 59 dis[i]=MAX; 60 for(j=0;j<N;j++) 61 g[i][j]=MAX; 62 63 } 64 for(i=0;i<M;i++) 65 { 66 scanf("%d%d%d",&a,&b,&l); 67 g[a][b]=g[b][a]=l; 68 } 69 Dijkstra(S); 70 }