HDU3790 最短路径问题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX 0x7ffffff
 4 struct G {
 5     int d;
 6     int p;
 7 }map[1001][1001];
 8 struct D {
 9     int d;
10     int p;
11 }dist[1001];
12 bool vis[1001];
13 int m,n,s,e;
14 void dijkstra()
15 {
16     int i,j,k,min;
17     for(i=1;i<n;i++){
18         for(min=MAX,j=1;j<=n;j++){
19             if(!vis[j]&&min>dist[j].d){
20                 min=dist[j].d;
21                 k=j;
22             }
23         }
24         vis[k]=1;
25         for(j=1;j<=n;j++){
26             if(!vis[j]){
27                 if(dist[j].d>dist[k].d+map[k][j].d){
28                     dist[j].d=dist[k].d+map[k][j].d;
29                     dist[j].p=dist[k].p+map[k][j].p;
30                 }else if(dist[j].d==dist[k].d+map[k][j].d&&dist[j].p>dist[k].p+map[k][j].p){
31                     dist[j].p=dist[k].p+map[k][j].p;
32                 }
33             }
34         }
35     }
36     printf("%d %d\n",dist[e].d,dist[e].p);
37 }
38 void init()
39 {
40     int i,j;
41     int a,b,d,p;
42     for(i=1;i<=n;i++){
43         for(j=1;j<=n;j++){
44             map[i][j].d=map[j][i].d=MAX;
45             map[i][j].p=map[j][i].p=MAX;
46         }
47         map[i][i].d=map[i][i].p=0;
48     }
49     for(i=0;i<m;i++) {
50         scanf("%d%d%d%d",&a,&b,&d,&p);
51         if(map[a][b].d>d){
52             map[a][b].d=map[b][a].d=d;
53             map[a][b].p=map[b][a].p=p;
54         }else if(map[a][b].d==d&&map[a][b].p>p){
55             map[a][b].p=map[b][a].p=p;
56         }
57     }
58     scanf("%d%d",&s,&e);
59     for(i=1;i<=n;i++){
60         dist[i].d=map[s][i].d;
61         dist[i].p=map[s][i].p;
62     }
63     memset(vis,0,sizeof(vis));
64     vis[s]=1;
65     dist[s].d=dist[s].p=0;
66 } 
67 int main()
68 {
69     while(scanf("%d%d",&n,&m),n||m){
70         init();
71         dijkstra();
72     }
73     return 0;
74 } 

我用dijkstra做的,还可以用其他方法去做!如:SPFA

原文地址:https://www.cnblogs.com/shihuajie/p/2798036.html