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
",g[start][end],v[start][end]);
76     }
77     return 0;
78 }
View Code
原文地址:https://www.cnblogs.com/zeze/p/hdoj3790.html