PTA 旅游规划(25 分)
7-10 旅游规划(25 分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入格式:
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。
输出格式:
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。
输入样例:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
#include<bits/stdc++.h> using namespace std; #define maxn 0x7fffffff int mat[505][505],vis[505],pay[505][505]; /* mat 是图的邻接矩阵表示,vis是标记数组 , pay 是花费的邻接矩阵表示 */ int dis[505],cost[505],n,m,path[505]; //最短路 + 路径输出 //n 是点的个数 标记为 0 ~ n-1 , //dis 最短路记录数组,cost 最小花费记录数组,path 路径记录数组 void dijkstra(int s) //修改后的最短路算法,+path 记录 和 花费计算 { int i,j; memset(vis,0,sizeof(vis));//清空标记数组 for(i=0;i<n;i++) { /* 用mat临接矩阵的值初始化dis 的值 用pay临接矩阵的值初始化cost 的值 */ dis[i]=mat[s][i]; cost[i]=pay[s][i]; if(dis[i]!=maxn) //无穷大代表此路不通 path[i] =-1,否则就在路径加入这个点 path[i]=s; else path[i]=-1; } vis[s]=1;//起始点标记 dis[s]=0;//自己到自己的花费cost = 0 cost[s]=0; for(i=1;i<n;i++) { int k=s,u=maxn; /* 找出到s距离最短&没标记的点,作为中转点更新dis值 */ for(j=0;j<n;j++) { if(!vis[j]&&dis[j]<u) { u=dis[j]; k=j; } } vis[k]=1;//标记这个点 for(j=0;j<n;j++) { if(!vis[j]&&mat[k][j]!=maxn) { /* 用这个点更新dis值,cost 和 dis同步更新,参数值相同 如果把k作为中转点成功缩减了dis值,就让k点加入path路径里 */ if(dis[j]>dis[k]+mat[k][j]) { dis[j]=dis[k]+mat[k][j]; cost[j]=cost[k]+pay[k][j]; path[j]=k; } /* 最短路径dis相同的话,选择花费最少的,最小cost */ else if(dis[j]==dis[k]+mat[k][j]) { /* 如果这个花费更加优,那么把这个点加入,更新最优秀的路径 最后path里面记录的是最优路径 */ if(cost[j]>cost[k]+pay[k][j]) { cost[j]=cost[k]+pay[k][j]; path[j]=k; } } } } } } void print(int s,int t) { stack<int>q; /* 从path里溯源t = path[t],返回上一个和t联通的路径,由后往前,把s~t路径放入队列里面,然后输出 */ while(t!=s) { q.push(t); t=path[t]; } q.push(t); while(!q.empty()) { cout<<q.top()<<" "; q.pop(); } } int main() { int s,t,a,b,d,w,i,j; cin>>n>>m>>s>>t; for(i=0;i<n;i++) for(j=0;j<n;j++) mat[i][j]=pay[i][j]=maxn; /* 初始化数组,让距离邻接矩阵数组值 = 无穷大,花费邻接矩阵的值 = 无穷大 这个计算方式对无向图和有向图同样适用,只需要部分修改 */ for(i=0;i<m;i++) { cin>>a>>b>>d>>w; if(mat[a][b]>d) { mat[a][b]=mat[b][a]=d; pay[a][b]=pay[b][a]=w; } else if(mat[a][b]==d) { if(pay[a][b]>w) pay[a][b]=pay[b][a]=w; } // 输入进行处理,最短路 } dijkstra(s); // 寻找从 s 开始 单源最短路 // print(s,t);// 输出路径, S 到 T 的路径 cout<<dis[t]<<" "<<cost[t]<<endl; // dist 指的是 距离 dis[t] 指的是花费 return 0; }
PTA 旅游规划(25 分)的更多相关文章
- PTA 07-图6 旅游规划 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划 (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...
- PAT 07-图6 旅游规划 (25分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...
- 【(图) 旅游规划 (25 分)】【Dijkstra算法】
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...
- PTA 列车调度 (25分)
PTA 列车调度 (25分) [程序实现] #include<bits/stdc++.h> using namespace std; int main(){ int num,n; cin& ...
- PTA 朋友圈 (25 分) 代码详解 (并查集)
1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...
- PTA 5-12 排序 (25分)
给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果. 本题旨在测试各种不同的排序算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:只有1个元素: 数据2:11个不相同的整数,测试 ...
- pat06-图5. 旅游规划(25)
06-图5. 旅游规划(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该 ...
- PTA 7-10(图) 旅游规划 最短路问题
7-10(图) 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果 ...
- PTA 11-散列3 QQ帐户的申请与登陆 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/723 5-15 QQ帐户的申请与登陆 (25分) 实现QQ新帐户申请和老帐户登陆的简 ...
随机推荐
- 延迟确认和Nagle算法
前篇文章介绍了三次握手和四次挥手,了解了TCP是如何建立和断开连接的,文末还提到了抓包挥手时的一个“异常”现象,当时无法解释,特地查了资料,知道了数据传输中的延迟确认策略. 何谓延迟确认策略? WIK ...
- Spring中报"Could not resolve placeholder"的解决方案
除去properites文件路径错误.拼写错误外,出现"Could not resolve placeholder"很有可能是使用了多个PropertyPlaceholderCon ...
- ssh整合之四单独搭建struts的运行环境
1.导入struts的基本jar包 2.在web.xml中配置我们struts的核心控制器StrutsPrepareAndExecuteFilter <?xml version="1. ...
- POJ1015 && UVA - 323 ~Jury Compromise(dp路径)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
- python/零起点(一、字典)
python/零起点(一.字典) dict( )字典 dict()强型转换成字典类型的数据类型: 字典的键(Key)必须是唯一不可变的 字典是无序,字典可变数据类型,且是可迭代的对象 字典清空操作案例 ...
- spark算子:partitionBy对数据进行分区
def partitionBy(partitioner: Partitioner): RDD[(K, V)] 该函数根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区. s ...
- javascript中的事件类型
表单事件 submit reset click change focus blur input window事件 load DomContentLoaded readyStatechange unlo ...
- Java基础之关键字,标识符,变量
Java基础 首先,来看一下Java基础知识图解,以下便是在java学习中我们需要学习设计到的一些知识(当然不是很完全). 这些都是接下来在以后的学习中我们会学到的一些知识. 1 关键字 首次先来学习 ...
- ES6关于Promise的用法
Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形 ...
- OpenGL平面阴影
几种绘制阴影的方法 在OpenGL中,比较常见的绘制阴影的方法有:shadow mapping,shadow volumes以及一种在红宝书上提及的适合在确定平面上绘制阴影的方法. 平面阴影 在确定的 ...