HDOJ 3790
dijstra最短路径算法
:
9885560 | 2013-12-23 23:54:56 | Accepted | 3790 | 203MS | 8112K | 1343 B | C++ | 泽泽 |
1 #include<cstdio> 2 #include<cstring> 3 #define inf 0xffffff 4 int g[1001][1001]; 5 int v[1001][1001]; 6 void dijstra(int n,int a) 7 { 8 int used[1001],i,j,k,min,dis[1001],lowcost[1001]; 9 memset(used,0,sizeof(used)); 10 for(i=1;i<=n;i++) 11 { 12 dis[i]=g[i][a]; 13 lowcost[i]=v[i][a]; 14 } 15 used[a]=1; 16 for(i=1;i<=n;i++) 17 { 18 j=a;min=inf; 19 for(k=1;k<=n;k++) 20 { 21 if(dis[k]<min&&!used[k]) 22 min=dis[k], 23 j=k; 24 } 25 used[j]=1; 26 for(k=1;k<=n;k++) 27 { 28 if(g[k][j]+dis[j]<dis[k]&&!used[k]) 29 { 30 g[a][k]=g[k][a]=dis[k]=g[k][j]+dis[j]; 31 lowcost[k]=v[a][k]=v[k][a]=v[k][j]+v[j][a]; 32 } 33 if(g[k][j]+dis[j]==dis[k]&&!used[k]) 34 { 35 if(v[k][j]+lowcost[j]<lowcost[k]) 36 { 37 lowcost[k]=v[k][a]=v[k][j]+v[j][a]; 38 } 39 40 } 41 } 42 } 43 44 } 45 int main() 46 { 47 int n,m,i,j,a,b,s,vi; 48 while(scanf("%d %d",&n,&m)!=EOF) 49 { 50 if(!n&&!m)break; 51 for(i=1;i<=n;i++) 52 { 53 for(j=1;j<=n;j++) 54 { 55 g[i][j]=inf,v[i][j]=inf; 56 } 57 g[i][i]=0; 58 } 59 for(i=1;i<=m;i++) 60 { 61 scanf("%d %d %d %d",&a,&b,&s,&vi); 62 if(s<g[a][b]) 63 { 64 g[a][b]=g[b][a]=s; 65 v[a][b]=v[b][a]=vi; 66 } 67 if(s==g[a][b]&&vi<v[a][b]) 68 { 69 v[a][b]=v[b][a]=vi; 70 } 71 } 72 int start,end; 73 scanf("%d %d",&start,&end); 74 dijstra(n,start); 75 printf("%d %d\n",g[start][end],v[start][end]); 76 } 77 return 0; 78 }