chenxi16

导航

数据结构1 - 07-图6 旅游规划

 

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 502
 4 #define INF 0x3fffffff
 5 int n,m,s,d;
 6 int g[MAXN][MAXN],vis[MAXN],weight[MAXN][MAXN],dist[MAXN],w[MAXN];
 7 void read();
 8 void Dijkstra(int s);
 9 int main(){
10     read();
11     Dijkstra(s);
12     if(dist[d]!=INF) printf("%d %d",dist[d],w[d]);
13     return 0;
14 }
15 void read(){
16     scanf("%d %d %d %d",&n,&m,&s,&d);
17     int i,j,v1,v2,d1,w1;
18     for(i=0;i<n;i++)
19       for(j=0;j<n;j++)
20         {
21             g[i][j] = INF;
22             weight[i][j] = INF;
23         }
24     for(i=0;i<m;i++){
25         scanf("%d %d %d %d",&v1,&v2,&d1,&w1);
26         g[v1][v2] = d1;
27         g[v2][v1] = d1;
28         weight[v1][v2] = w1;
29         weight[v2][v1] = w1;
30     }
31 }
32 void Dijkstra(int s){
33     int i,j;
34     for(i=0;i<n;i++) {
35         dist[i] = INF;
36         vis[i] = 0;
37     }
38     dist[s] = 0;
39     while(1){
40         int min=INF,mindex=-1;
41         for(i=0;i<n;i++){
42             if(dist[i]<min&&vis[i]==0){
43                 min = dist[i];
44                 mindex = i;
45             }
46         }
47         if(mindex==-1) break;
48         vis[mindex] = 1;
49         for(i=0;i<n;i++){
50             if(g[mindex][i]!=INF&&vis[i]==0&&i!=mindex){
51                 if(dist[mindex]+g[mindex][i]<dist[i]){
52                     dist[i] = dist[mindex] + g[mindex][i];
53                     w[i] = w[mindex] + weight[mindex][i];
54                 }
55                 else if(dist[mindex]+g[mindex][i]==dist[i]){
56                     if(w[mindex]+weight[mindex][i]<w[i]){
57                         w[i] = w[mindex]+weight[mindex][i]; 
58                     }
59                 }
60             }
61         }
62     }
63 }
View Code

 

posted on 2020-04-05 18:01  chenxi16  阅读(276)  评论(0编辑  收藏  举报