3 2 1 2 5 6 2 3 4 5 1 3 0 0
9 11
#include<stdio.h> #include<string.h> const int maxint=0xfffffff; const int N=1000+10; int map[1001][1001],cost[1001][1001]; int min_dis,min_cost; void dijkstra(int s,int t,int n){ int i,j,k,p,min; static bool visit[N]; int dis[N],cost1[N]; memset(visit,0,sizeof(visit)); for(i=1;i<=N;++i){ dis[i]=map[s][i]; cost1[i]=cost[s][i]; } dis[s]=0; visit[s]=true; for(k=1;k<n;++k){ for(min=maxint,i=1;i<=n;++i){ if(!visit[i]&&dis[i]<min) p=i,min=dis[i]; } if(min>=maxint) break; for(visit[p]=1,i=1;i<=n;++i) if(!visit[i]&&map[p][i]>=0){ if(min+map[p][i]<dis[i]) dis[i]=min+map[p][i],cost1[i]=cost[p][i]+cost1[p]; //path[i]=p; else if(dis[i]==min+map[p][i]&&cost1[i]>cost[p][i]+cost1[p]) cost1[i]=cost[p][i]+cost1[p]; } if(visit[t]){ min_dis=dis[t]; min_cost=cost1[t]; return ; } } } int main(){ int n,m,i,j,a,b,d,p,s,t; while(~scanf("%d%d",&n,&m),n||m){ for(i=1;i<=n;++i) for(j=1;j<=i;++j){ map[i][j]=map[j][i]=maxint; cost[i][j]=cost[j][i]=maxint; } for(i=1;i<=m;++i){ scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b]>d) //最开始没有判断 map[a][b] 与 d 的大小,而把d直接赋值给 map[a][b] 了,导致wrong !!!!!! map[a][b]=map[b][a]=d,cost[a][b]=cost[b][a]=p; } scanf("%d%d",&s,&t); dijkstra(s,t,n); printf("%d %d\n",min_dis,min_cost); } return 0; }
原文:http://blog.csdn.net/qq_18062811/article/details/44679209