数据结构实验之图论七:驴友计划
Time Limit: 1000MS Memory Limit: 65536KB
Submit
Statistic
Problem Description
做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。
Input
连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
Output
在同一行中输出路径长度和收费总额,数据间用空格间隔。
Example Input
1 4 5 0 3 0 1 1 20 1 3 2 30 0 3 4 10 0 2 2 20 2 3 1 20
Example Output
3 40
DQE:
解法一(推荐):
迪杰斯特拉算法,在双权无向图中做小修改即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <climits> 4 5 using namespace std; 6 7 #define MVN 510 8 9 typedef struct AdjMatrix 10 { 11 int w; //距离 12 int m; //费用 13 char *info; 14 }AM; 15 16 typedef struct MGraph 17 { 18 int vex[MVN]; 19 AM arc[MVN][MVN]; 20 int vexn,arcn; 21 int s,e; //起点,终点(编号-下标) 22 }MG; 23 24 void creat(MG &G) 25 { 26 int i,j,w,m,k; 27 for(i=0;i<G.vexn;i++) 28 for(j=0;j<G.vexn;j++) 29 { 30 G.arc[i][j].w=INT_MAX; 31 G.arc[i][j].m=0; 32 } 33 for(k=0;k<G.arcn;k++) 34 { 35 scanf("%d %d %d %d",&i,&j,&w,&m); 36 G.arc[i][j].w=G.arc[j][i].w=w; 37 G.arc[i][j].m=G.arc[j][i].m=m; 38 } 39 } 40 41 struct{int w,m;}D[MVN]; //辅助数组{当前最短距离和,当前费用和} 42 void short_p(MG &G) 43 { 44 bool f[MVN]={false}; //是否锁定为最短路径 45 int i,j,k,min; 46 //初始化辅助数组并锁定起点 47 for(k=0;k<G.vexn;k++) 48 { 49 D[k].w=G.arc[G.s][k].w; 50 D[k].m=G.arc[G.s][k].m; 51 } 52 f[G.s]=true; 53 //选择并锁定下一最短路径顶点 54 for(k=1;k<G.vexn;k++) 55 { 56 min=INT_MAX; 57 for(j=0;j<G.vexn;j++) 58 if(!f[j]) 59 if(D[j].w<min) 60 { 61 i=j; 62 min=D[j].w; 63 } 64 f[i]=true; 65 //更新该顶点的邻接点的最短路 66 for(j=0;j<G.vexn;j++) 67 if(!f[j]&&G.arc[i][j].w<INT_MAX) 68 if(min+G.arc[i][j].w<D[j].w) 69 { 70 D[j].w=min+G.arc[i][j].w; 71 D[j].m=D[i].m+G.arc[i][j].m; 72 } 73 else if(min+G.arc[i][j].w==D[j].w && D[i].m+G.arc[i][j].m<D[j].m) //距离相同时选择费用更少 74 D[j].m=D[i].m+G.arc[i][j].m; 75 } 76 } 77 78 int main() 79 { 80 int t; 81 scanf("%d",&t); 82 while(t--) 83 { 84 MG G; 85 scanf("%d %d %d %d",&G.vexn,&G.arcn,&G.s,&G.e); 86 creat(G); 87 short_p(G); 88 printf("%d %d\n",D[G.e].w,D[G.e].m); 89 } 90 return 0; 91 } 92 93 /*************************************************** 94 User name: *** 95 Result: Accepted 96 Take time: 0ms 97 Take Memory: 176KB 98 Submit time: 2016-11-17 18:23:42 99 ****************************************************/
解法二(不推荐):深度优先搜索,注意搜索过程中的回退需要清除相关标记。
1 #include <iostream> 2 #include <cstdio> 3 #include <climits> 4 5 using namespace std; 6 7 #define MVN 550 8 9 typedef struct AdjMatrix 10 { 11 int w; 12 int m; 13 char *info; 14 }AM; 15 16 typedef struct MGraph 17 { 18 int vex[MVN]; 19 AM arc[MVN][MVN]; 20 int vexnum,arcnum; 21 int s,d; 22 int w,m; 23 int minw,minm; 24 }MG; 25 26 void creat(MG &G) 27 { 28 int i,j,w,m,k; 29 for(k=0;k<G.vexnum;k++) 30 G.vex[k]=k; 31 for(k=0;k<G.arcnum;k++) 32 { 33 scanf("%d %d %d %d",&i,&j,&w,&m); 34 G.arc[i][j].w=w; 35 G.arc[i][j].m=m; 36 G.arc[j][i].w=w; 37 G.arc[j][i].m=m; 38 } 39 } 40 41 void DFS(MG &G,bool *visited,int i) 42 { 43 visited[i]=true; 44 if(i==G.d) 45 { 46 if(G.w<G.minw || G.w==G.minw && G.m<G.minm) 47 { 48 G.minw=G.w; 49 G.minm=G.m; 50 } 51 } 52 else 53 { 54 int k; 55 for(k=0;k<G.vexnum;k++) 56 { 57 if(G.arc[i][k].w<INT_MAX&&visited[k]==false) 58 { 59 G.w+=G.arc[i][k].w; 60 G.m+=G.arc[i][k].m; 61 DFS(G,visited,k); 62 63 visited[k]=false; //※探索不同路径后的回退操作※ 64 G.w-=G.arc[i][k].w; 65 G.m-=G.arc[i][k].m; 66 } 67 } 68 } 69 } 70 71 int main() 72 { 73 int t; 74 scanf("%d",&t); 75 while(t--) 76 { 77 MG G={0}; 78 scanf("%d %d %d %d",&G.vexnum,&G.arcnum,&G.s,&G.d); 79 int k,o; 80 for(k=0;k<G.vexnum;k++) 81 { 82 for(o=0;o<G.vexnum;o++) 83 G.arc[k][o].w=INT_MAX; 84 }//初始化邻接矩阵 85 creat(G); 86 bool visited[MVN]={false}; 87 G.minm=INT_MAX; //初始化一个最大值 88 G.minw=INT_MAX; 89 DFS(G,visited,G.s); 90 printf("%d %d\n",G.minw,G.minm); 91 } 92 return 0; 93 } 94 95 /*************************************************** 96 User name: *** 97 Result: Accepted 98 Take time: 0ms 99 Take Memory: 2832KB 100 Submit time: 2016-11-09 22:46:01 101 ****************************************************/