1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1<<31-1; 6 int map[1004][1004][2]; 7 int v[1004],s1[1004],s2[1004]; 8 int n; 9 void dijk(int x) 10 { 11 v[x]=1; 12 int i; 13 for (i=1;i<=n;i++) 14 { 15 s1[i]=map[i][x][0]; 16 s2[i]=map[i][x][1]; 17 } 18 while (1) 19 { 20 int m1=N,m2=N,p=x; 21 for (i=1;i<=n;i++) 22 { 23 if (v[i]) continue; 24 if (m1>s1[i]) 25 { 26 m1=s1[i]; 27 m2=s2[i]; 28 p=i; 29 } 30 else if (m1==s1[i]&&m2<s2[i]) 31 { 32 m2=s2[i]; 33 p=i; 34 } 35 } 36 if (p==x) break; 37 v[p]=1; 38 for (i=1;i<=n;i++) 39 { 40 if (v[i]) continue; 41 if (s1[i]>s1[p]+map[p][i][0]) 42 { 43 s1[i]=s1[p]+map[p][i][0]; 44 s2[i]=s2[p]+map[p][i][1]; 45 } 46 else if (s1[i]==s1[p]+map[p][i][0]&&s2[i]>s2[p]+map[p][i][1]) 47 s2[i]=s2[p]+map[p][i][1]; 48 } 49 } 50 } 51 int main() 52 { 53 int m,i,j,a,b,c,d; 54 while (~scanf("%d%d",&n,&m)) 55 { 56 if (n==0&&m==0) break; 57 for (i=1;i<=n;i++) 58 for (j=1;j<=n;j++) 59 { 60 map[i][j][0]=N; 61 map[i][j][1]=N; 62 } 63 for (i=1;i<=m;i++) 64 { 65 scanf("%d%d%d%d",&a,&b,&c,&d); 66 if (map[a][b][0]>c) 67 { 68 map[a][b][0]=map[b][a][0]=c; 69 map[a][b][1]=map[b][a][1]=d; 70 } 71 else if (map[a][b][0]==c&&map[a][b][0]>d) 72 { 73 map[a][b][0]=map[b][a][0]=c; 74 map[a][b][1]=map[b][a][1]=d; 75 } 76 } 77 memset(v,0,sizeof(v)); 78 scanf("%d%d",&a,&b); 79 dijk(a); 80 printf("%d %d\n",s1[b],s2[b]); 81 } 82 }
原文:http://www.cnblogs.com/pblr/p/4766517.html