pta l3-7(天梯地图)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792
题意:给定n个地点,m条边以及边的信息,给出起点s,终点d,求s到d的最快距离,不唯一时取距离最短的,还要求s到d的最短距离,不唯一时取经过结点数最少的,若这两条路线重合,输出一条即可。
思路:两次dijkstra算法,第一次的两个维度是时间tim,距离len,用pre1记录路径; 第二次的两个维度是距离len,经过结点数num,用pre2记录路径。为了便于比较两条路径是否一致,可将其存在vector中,直接用‘==’判断即可,然后按照要求输出(代码看着挺长,其实两次dijkstra差不多)。
AC代码:
#include <bits/stdc++.h>
using namespace std; const int maxn=;
const int inf=0x3f3f3f3f;
int n,m,s,d;
int a[maxn][maxn],b[maxn][maxn],tim[maxn],len[maxn],num[maxn],vis1[maxn],vis2[maxn],pre1[maxn],pre2[maxn];
vector<int> v1,v2; void dijkstra1(){
len[s]=tim[s]=;
for(int i=;i<n;++i){
int k,Min=inf;
for(int j=;j<n;++j)
if(!vis1[j]&&tim[j]<Min)
k=j,Min=tim[j];
if(Min==inf) break;
vis1[k]=;
for(int j=;j<n;++j)
if(!vis1[j]&&tim[j]>tim[k]+b[k][j]){
tim[j]=tim[k]+b[k][j];
len[j]=len[k]+a[k][j];
pre1[j]=k;
}
else if(!vis1[j]&&tim[j]==tim[k]+b[k][j]&&len[j]>len[k]+a[k][j]){
len[j]=len[k]+a[k][j];
pre1[j]=k;
}
}
} void dijkstra2(){
len[s]=,num[s]=,pre2[s]=-;
for(int i=;i<n;++i){
int k,Min=inf;
for(int j=;j<n;++j)
if(!vis2[j]&&len[j]<Min)
k=j,Min=len[j];
if(Min==inf) break;
vis2[k]=;
for(int j=;j<n;++j)
if(!vis2[j]&&len[j]>len[k]+a[k][j]){
len[j]=len[k]+a[k][j];
num[j]=num[k]+;
pre2[j]=k;
}
else if(!vis2[j]&&len[j]==len[k]+a[k][j]&&num[j]>num[k]+){
num[j]=num[k]+;
pre2[j]=k;
}
}
} void getv1(){
int p=d;
while(p!=-){
v1.push_back(p);
p=pre1[p];
}
} void getv2(){
int p=d;
while(p!=-){
v2.push_back(p);
p=pre2[p];
}
} int main()
{
scanf("%d%d",&n,&m);
memset(a,0x3f,sizeof(a));
memset(b,0x3f,sizeof(b));
for(int i=;i<n;++i)
tim[i]=len[i]=inf,pre1[i]=-;
for(int i=;i<m;++i){
int t1,t2,flag,l,t;
scanf("%d%d%d%d%d",&t1,&t2,&flag,&l,&t);
a[t1][t2]=l,b[t1][t2]=t;
if(!flag)
a[t2][t1]=l,b[t2][t1]=t;
}
scanf("%d%d",&s,&d);
dijkstra1();
getv1();
for(int i=;i<n;++i)
len[i]=num[i]=inf,pre2[i]=-;
dijkstra2();
getv2();
if(v1==v2){
printf("Time = %d; Distance = %d: %d",tim[d],len[d],s);
for(int i=v1.size()-;i>=;--i)
printf(" => %d",v1[i]);
}
else{
printf("Time = %d: %d",tim[d],s);
for(int i=v1.size()-;i>=;--i)
printf(" => %d",v1[i]);
printf("\n");
printf("Distance = %d: %d",len[d],s);
for(int i=v2.size()-;i>=;--i)
printf(" => %d",v2[i]);
}
return ;
}
pta l3-7(天梯地图)的更多相关文章
- CCCC L2-001 紧急救援 floyd改的dijkstra模板 (记录路径) L3 天梯地图
https://www.patest.cn/contests/gplt/L2-001 题解:求最短路的条数,并输出点的权值最大的路径,用priority_queue会wa两个点,原因不明. 于是又学了 ...
- PTA天梯 L3-007 天梯地图
L3-007 天梯地图 题目: 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地 ...
- L3-007. 天梯地图
L3-007. 天梯地图 题目链接:https://www.patest.cn/contests/gplt/L3-007 Dijstra 这题是Dijstra的变形,麻烦的是两种最短路的相同距离时的选 ...
- pat 团体天梯赛 L3-007. 天梯地图
L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...
- PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)
L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
- PTA天梯地图
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
- pta 天梯地图 (Dijkstra)
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
- PAT L3-007 天梯地图
https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输 ...
随机推荐
- 关于阿里云图片识别接口的demo
服务器处理过程 $host = "https://dm-53.data.aliyun.com"; $path = "/rest/160601/ocr/ocr_vehicl ...
- webstorm上svn的安装使用
1.首先要下载SlikSvn网址为:https://sliksvn.com/download/ 进入该网站可以根据需要下载32位的或者64位的svn.下图为要下载的图标样式 点击下载即可. 2.在w ...
- day35-常见内置模块四(logging模块)
一.函数式简单配置(低配) 1.只能在屏幕上显示,或者写入文件,不能同时进行 import logging logging.debug('调试') logging.info('正常运行') loggi ...
- js求时间差,两个日期月份差
var date1=new Date(); //开始时间 alert("aa"); var date2=new Date(); //结束时间 var date3=date2 ...
- SpringBoot配置发送邮件
一.导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- linux 不同服务器之间复制文件
----------------------拷贝文件夹---------------------------------------------- 把当前文件夹tempA拷贝到 目标服务器10.127 ...
- 各种Queue分析
Queue主要方法的区别: 抛出异常 返回特殊值 插入 add(e)插入成功则返回true,没有可用空间则IllegalStateException offer(e) 移除 remove(e)获取 ...
- 谈USB重定向的方式
在桌面虚拟化的项目中,常常会遇到用户提出的各自外设需求,这时产品对外设的兼容性就成为了项目成败的拦路虎 本文试图用通俗易懂的语言讲讲USB外设重定向的工作流程,先看看普通PC上USB设备的工作流程 u ...
- c++复习:C++输入和输出流
C++输入和输出流 1.I/O流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 对系统指定的标准 ...
- C#new出来的结构体内存分配在堆上
如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的.我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理. new int[10]这个说明不了什么,因为数组是 ...