数据结构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 }