7-10 旅游规划(25 分)

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

输入格式:

输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市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. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 0x7fffffff
  4. int mat[505][505],vis[505],pay[505][505];
  5. /*
  6. mat 是图的邻接矩阵表示,vis是标记数组 , pay 是花费的邻接矩阵表示
  7. */
  8. int dis[505],cost[505],n,m,path[505]; //最短路 + 路径输出
  9. //n 是点的个数 标记为 0 ~ n-1 ,
  10. //dis 最短路记录数组,cost 最小花费记录数组,path 路径记录数组
  11. void dijkstra(int s) //修改后的最短路算法,+path 记录 和 花费计算
  12. {
  13. int i,j;
  14. memset(vis,0,sizeof(vis));//清空标记数组
  15. for(i=0;i<n;i++)
  16. {
  17. /*
  18. 用mat临接矩阵的值初始化dis 的值
  19. 用pay临接矩阵的值初始化cost 的值
  20. */
  21. dis[i]=mat[s][i];
  22. cost[i]=pay[s][i];
  23. if(dis[i]!=maxn) //无穷大代表此路不通 path[i] =-1,否则就在路径加入这个点
  24. path[i]=s;
  25. else path[i]=-1;
  26. }
  27. vis[s]=1;//起始点标记
  28. dis[s]=0;//自己到自己的花费cost = 0
  29. cost[s]=0;
  30. for(i=1;i<n;i++)
  31. {
  32. int k=s,u=maxn;
  33. /*
  34. 找出到s距离最短&没标记的点,作为中转点更新dis值
  35. */
  36. for(j=0;j<n;j++)
  37. {
  38. if(!vis[j]&&dis[j]<u)
  39. {
  40. u=dis[j];
  41. k=j;
  42. }
  43. }
  44. vis[k]=1;//标记这个点
  45. for(j=0;j<n;j++)
  46. {
  47. if(!vis[j]&&mat[k][j]!=maxn)
  48. {
  49. /*
  50. 用这个点更新dis值,cost 和 dis同步更新,参数值相同
  51. 如果把k作为中转点成功缩减了dis值,就让k点加入path路径里
  52. */
  53. if(dis[j]>dis[k]+mat[k][j])
  54. {
  55. dis[j]=dis[k]+mat[k][j];
  56. cost[j]=cost[k]+pay[k][j];
  57. path[j]=k;
  58. }
  59. /*
  60. 最短路径dis相同的话,选择花费最少的,最小cost
  61. */
  62. else if(dis[j]==dis[k]+mat[k][j])
  63. {
  64. /*
  65. 如果这个花费更加优,那么把这个点加入,更新最优秀的路径
  66. 最后path里面记录的是最优路径
  67. */
  68. if(cost[j]>cost[k]+pay[k][j])
  69. {
  70. cost[j]=cost[k]+pay[k][j];
  71. path[j]=k;
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. void print(int s,int t)
  79. {
  80. stack<int>q;
  81. /*
  82. 从path里溯源t = path[t],返回上一个和t联通的路径,由后往前,把s~t路径放入队列里面,然后输出
  83. */
  84. while(t!=s)
  85. {
  86. q.push(t);
  87. t=path[t];
  88. }
  89. q.push(t);
  90. while(!q.empty())
  91. {
  92. cout<<q.top()<<" ";
  93. q.pop();
  94. }
  95. }
  96. int main()
  97. {
  98. int s,t,a,b,d,w,i,j;
  99. cin>>n>>m>>s>>t;
  100. for(i=0;i<n;i++)
  101. for(j=0;j<n;j++)
  102. mat[i][j]=pay[i][j]=maxn;
  103. /*
  104. 初始化数组,让距离邻接矩阵数组值 = 无穷大,花费邻接矩阵的值 = 无穷大
  105. 这个计算方式对无向图和有向图同样适用,只需要部分修改
  106. */
  107. for(i=0;i<m;i++)
  108. {
  109. cin>>a>>b>>d>>w;
  110. if(mat[a][b]>d)
  111. {
  112. mat[a][b]=mat[b][a]=d;
  113. pay[a][b]=pay[b][a]=w;
  114. }
  115. else if(mat[a][b]==d)
  116. {
  117. if(pay[a][b]>w)
  118. pay[a][b]=pay[b][a]=w;
  119. } // 输入进行处理,最短路
  120. }
  121. dijkstra(s); // 寻找从 s 开始 单源最短路
  122. // print(s,t);// 输出路径, S 到 T 的路径
  123. cout<<dis[t]<<" "<<cost[t]<<endl; // dist 指的是 距离 dis[t] 指的是花费
  124. return 0;
  125. }

  

PTA 旅游规划(25 分)的更多相关文章

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

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

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

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

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

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

  4. PTA 列车调度 (25分)

    PTA 列车调度 (25分) [程序实现] #include<bits/stdc++.h> using namespace std; int main(){ int num,n; cin& ...

  5. PTA 朋友圈 (25 分) 代码详解 (并查集)

    1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...

  6. PTA 5-12 排序 (25分)

    给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果. 本题旨在测试各种不同的排序算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:只有1个元素: 数据2:11个不相同的整数,测试 ...

  7. pat06-图5. 旅游规划(25)

    06-图5. 旅游规划(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该 ...

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

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

  9. PTA 11-散列3 QQ帐户的申请与登陆 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/723 5-15 QQ帐户的申请与登陆   (25分) 实现QQ新帐户申请和老帐户登陆的简 ...

随机推荐

  1. JAVA_SE基础——71.Random类制作随机验证码

    public class Demo5 { public static void main(String[] args) { char[] arr={'s','b','g','h','a','c'}; ...

  2. 隐藏Easy UI 中parent.$.modalDialog 的button

    例子: buttons : [ { text : '关闭', handler : function() { parent.$.modalDialog.handler.dialog('close'); ...

  3. Homebrew update error not work on OSX

    brew update 错误是这样的 chown: /usr/local: Operation not permitted 然后网上osx 10.11, 10.12的解决方法这样的 The probl ...

  4. 百度地图api的用法

    功能: 1.点击"江干区",地图自动定位到该区域,并且该区域出现overlay(红色) 2.点击"派出所"."社区"级别时,地图也自动定位同 ...

  5. 丢掉DDL,我用这招3分钟清空 MySQL 9亿记录数据表

    摘要:最近由于福建开机广告生产环境的广告日志备份表主键(int类型)达到上限(21亿多),不能再写入数据,需要重新清空下该表并将主键重置,但由于表里有8亿多记录的数据量,使用重置命令及DDL命令执行地 ...

  6. Java并发编程:synchronized和锁优化

    1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...

  7. 通过wget工具下载指定文件中的URLs对应的资源并保存到指定的本地目录中去并进行文件完整性与可靠性校验

    创建URLs文件在终端输入cd target_directory回车,便把当前文件夹切换到了目标文件夹target_directory,此后创建的文件都会丢它里面在终端输入cat > URLs回 ...

  8. Struts(二十):自定义类型转换器

    如何自定义类型转换器: 1)为什么需要自定义类型转化器?strtuts2不能自动完成字符串到所有的类型: 2) 如何定义类型转化器? 步骤一:创建自定义类型转化器的类,并继承org.apache.st ...

  9. UVA-562 Dividing coins---01背包+平分钱币

    题目链接: https://vjudge.net/problem/UVA-562 题目大意: 给定n个硬币,要求将这些硬币平分以使两个人获得的钱尽量多,求两个人分到的钱最小差值 思路: 它所给出的n个 ...

  10. Object.prototype.toString.call(obj)使用方法以及原理

    这几天看vue-router的源码 发现了Object.prototype.toString.call()这样的用法,当时以为这就是转成字符串的用的,但是越看越觉得不太对劲,赶紧查查资料,一查才知道没 ...