有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1);MM是高速公路的条数;SS是出发地的城市编号;DD是目的地的城市编号。随后的MM行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

  1. 4 5 0 3
  2. 0 1 1 20
  3. 1 3 2 30
  4. 0 3 4 10
  5. 0 2 2 20
  6. 2 3 1 20

输出样例:

  1. 3 40
  2.  
  1. /* 题意要求: 保证最短距离,若距离相等 则选取总价格最低的路径
  2. 1. dijkstra找最短路 一个新节点加入已找到最短路径的集合S后 更新其他所有点的权重时 需要增加一种情况 就是当距离不变时 更新价格为较小的
  3. 那条路的价格 。
  4. */
  5. #include "iostream"
  6. using namespace std;
  7. #define INF 501
  8. int dist[];
  9. int map[][]; /* 2城市之间的距离~ */
  10. int cost[][]; /* 2城市之间的路费~ */
  11. int MCost[];
  12. bool visited[] = {false}; /* 判断该点是否已经求出最短路 */
  13. /* dijkstra求最短路的变种~
  14. */
  15. void dijkstra(int v0,int v,int d) {
  16. dist[v0] = ; visited[v0] = true; /* 初始状态 v节点属于集合 */
  17. int i, w;
  18. for (i = ; i < v; i++) { /* 开始主循环 每次求得v到某个顶点的最短路径 并加v到集合 */
  19. int MIN = INF; /* 当前所知离v0最近的节点 */
  20. for (w = ; w < v; w++) {
  21. if (!visited[w] ) { /* 节点在 结合 V-S中 */
  22. if (dist[w] < MIN) { /* 找到最短路径节点 */
  23. MIN = dist[w];
  24. v0 = w;
  25. }
  26. }
  27. }
  28. visited[v0] = true;
  29. for (w = ; w < v; w++) { /* 更新当前的最短路径 */
  30. if (!visited[w] && MIN + map[v0][w] < dist[w]) {
  31. dist[w] = MIN + map[v0][w];
  32. MCost[w] = MCost[v0] + cost[v0][w];
  33. }
  34. else if (!visited[w] && MIN + map[v0][w] == dist[w] && MCost[w] > MCost[v0] + cost[v0][w]) { /* 路径长度相等则选择价格较便宜的一条*/
  35. MCost[w] = MCost[v0] + cost[v0][w];
  36. }
  37. }
  38. }
  39. }
  40. int main() {
  41. int v, e, s, d;
  42. cin >> v >> e >> s >> d;
  43. for(int i=;i<v;i++)
  44. for (int j = ; j < v; j++) {
  45. map[i][j] = map[j][i] = INF;
  46. cost[i][j] = cost[j][i] = INF;
  47. }
  48. for (int i = ; i < e; i++) {
  49. int a, b, c, d;
  50. cin >> a >> b >> c >> d;
  51. map[a][b] = map[b][a] = c;
  52. cost[a][b] = cost[b][a] = d;
  53. }
  54. for (int i = ; i < v; i++) {
  55. dist[i] = map[i][s]; /* 记录当到出发点的距离 */
  56. MCost[i] = cost[i][s];
  57. }
  58. dijkstra(s,v,d);
  59. cout << dist[d] <<" "<<MCost[d]<< endl;
  60. return ;
  61. }

PAT 07-图6 旅游规划 (25分)的更多相关文章

  1. 【(图) 旅游规划 (25 分)】【Dijkstra算法】

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...

  2. PTA 07-图6 旅游规划 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划   (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...

  3. PTA 7-10(图) 旅游规划 最短路问题

    7-10(图) 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果 ...

  4. PAT乙级:1090危险品装箱(25分)

    PAT乙级:1090危险品装箱(25分) 题干 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清 ...

  5. PAT乙级:1070 结绳 (25分)

    PAT乙级:1070 结绳 (25分) 题干 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟 ...

  6. PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)

    1013 Battle Over Cities (25 分)   It is vitally important to have all the cities connected by highway ...

  7. PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

    1040 Longest Symmetric String (25 分)   Given a string, you are supposed to output the length of the ...

  8. PAT 甲级 1017 Queueing at Bank (25 分)(模拟题,有点思维小技巧,第二次做才理清思路)

    1017 Queueing at Bank (25 分)   Suppose a bank has K windows open for service. There is a yellow line ...

  9. 【刷题-PAT】A1126 Eulerian Path (25 分)

    1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every ...

随机推荐

  1. xml &amp; 符号表示方法,xml转义字符

    HTML,xml 中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用他们的转义序列,如下所示: & 或 &am ...

  2. BZOJ 3715: [PA2014]Lustra

    Description Byteasar公司专门外包生产带有镜子的衣柜.刚刚举行的招标会上,有n个工厂参加竞标.所有镜子都是长方形的,每个工厂能够制造的镜子都有其各自的最大.最小宽度和最大.最小高度. ...

  3. hdu 3718

    一个二分图最大匹配的题: 匈牙利算法不熟: 建了个模,用最小费用最大流解决了 #include <iostream> #include <cstring> #define IN ...

  4. unity 导出 android安装包配置方案

    原地址:http://blog.csdn.net/u012085988/article/details/17393111 1.jdk本人安装的是win32版的(虽然系统是64位的.但听说装64位的导出 ...

  5. android 在activity中改变标题栏的标题 tabActivity的标题改变

    在activity中改变标题栏的标题是调用setTitle()方法,参数为标题名称. 而tabActivity跟Activity是一样的,因此在onCheckedChanged()方法中要动态改变标题 ...

  6. YII AR查询方法

    ActiveRecord类文档:http://www.yiiframework.com/doc/guide/1.1/en/database.ar 对于一个Model Post 有如下的4中查询方法,返 ...

  7. 保持与 Microsoft Azure Files 的连接

    我们在最近的博客文章中介绍了 Azure StorageFiles的预览版,请单击此处.该文章包含 Azure Files 的相关信息,说明了如何申请预览版并开始使用,还介绍了一些有助于创建共享和传 ...

  8. htmlparser使用例子(全) 转载

    1.import java.net.URL;  2.  3.import junit.framework.TestCase;  4.  5.import org.apache.log4j.Logger ...

  9. 浏览器中的XML与JavaScript

    浏览器中的XML与JavaScript 在处理XML前,你需要在JavaScript中获取它.这一部分展示了一些不同的方法用来在JavaScript中获取XML并且对它进行处理. XML的节点类型 在 ...

  10. Dim Loop 出现结果不同

    (1)结果是:循环1次 Dim counter,num counter = 0 'num = 9 Do Until num = 10     num = num - 1     counter = c ...