SDUT 3363 数据结构实验之图论七:驴友计划m

题目链接 :http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3363

数据结构实验之图论七:驴友计划

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。

输入

连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。 

输出

在同一行中输出路径长度和收费总额,数据间用空格间隔。 

示例输入

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

示例输出

3 40

提示

 

来源

xam 

示例程序

由于没有说明M的值,导致N^2与M的值不确定,所以图的存储也就必须得选择邻接矩阵的方式存储,然后需要的就是遍历整个图然后输出路径最短的路径,如果多条路径最短就输出过路费最少的路径,很明显就是图的深度优先搜索了,也没有什么特别需要注意的地方,代码如下:

view plain copy print 如果您复制代码时出现行号,请点击左边的“view plain”后再复制
  1. #include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. int n, m, s, e, min1, min2;  
  6. bool vis[505];  
  7. const int inf=99999999;  
  8. struct node  
  9. {  
  10.     int l, m;  //l为路径长度,m为路径花费
  11. }boy[505][505];  
  12.   
  13. void dfs(int cur, int ans1, int ans2)  //ans1、ans2分别为当前结点cur对应的路径长度和花费
  14. {  
  15.   
  16.     if(cur==e)  
  17.     {  
  18. //        printf("%d %d\n%d %d\n", ans1, ans2, min1, min2);  
  19.         if((ans1<min1)||(ans1==min1&&ans2<min2))  \\如果结点为目标结点,更新最短路径长度min1和最小花费min2
  20.         {  
  21.             min1=ans1;  
  22.             min2=ans2;  
  23.         }  
  24.     }  
  25.     for(int i=0;i<n;i++)  
  26.     {  
  27.         if(boy[cur][i].l!=inf&&!vis[i])  
  28.         {  
  29.             vis[i]=1;  
  30.             dfs(i,boy[cur][i].l+ans1,ans2+boy[cur][i].m);  
  31.             vis[i]=0;  \\尝试完毕、递归回朔时取消标记
  32.         }  
  33.     }  
  34.     return ;  
  35. }  
  36.   
  37. int main()  
  38. {  
  39.     int t;  
  40.     scanf("%d", &t);  
  41.     while(t--)  
  42.     {  
  43.         min1=min2=inf;  
  44.         scanf("%d %d %d %d", &n, &m, &s, &e);  
  45.         for(int i=0;i<n;i++)  //初始化邻接矩阵
  46.             for(int j=0;j<n;j++)  
  47.             if(i==j) boy[i][j].l=boy[i][j].m=0;  
  48.             else boy[i][j].l=boy[i][j].m=inf;  
  49.         while(m--)  
  50.         {  
  51.             int a, b, c, d;  
  52.             scanf("%d %d %d %d", &a, &b, &c, &d);  
  53.             if(boy[a][b].l>c)  
  54.                 boy[a][b].l=boy[b][a].l=c;  
  55.             if(boy[a][b].m>d)  
  56.                 boy[a][b].m=boy[b][a].m=d;  
  57.         }  
  58.         memset(vis,0,sizeof(vis));  //初始化vis标记数组
  59.         vis[s]=1;  
  60.         dfs(s,0,0);  
  61.         printf("%d %d\n", min1, min2);  
  62.     }  
  63. }  
  64.    

你可能感兴趣的:(SDUT 3363 数据结构实验之图论七:驴友计划m)