题目链接: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(天梯地图)的更多相关文章

  1. CCCC L2-001 紧急救援 floyd改的dijkstra模板 (记录路径) L3 天梯地图

    https://www.patest.cn/contests/gplt/L2-001 题解:求最短路的条数,并输出点的权值最大的路径,用priority_queue会wa两个点,原因不明. 于是又学了 ...

  2. PTA天梯 L3-007 天梯地图

    L3-007 天梯地图 题目: 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地 ...

  3. L3-007. 天梯地图

    L3-007. 天梯地图 题目链接:https://www.patest.cn/contests/gplt/L3-007 Dijstra 这题是Dijstra的变形,麻烦的是两种最短路的相同距离时的选 ...

  4. pat 团体天梯赛 L3-007. 天梯地图

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  5. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  6. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  7. PTA天梯地图

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  8. pta 天梯地图 (Dijkstra)

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  9. PAT L3-007 天梯地图

    https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输 ...

随机推荐

  1. IP与十进制相互转化

    def ip2Long(ip: String): Long = { val fragments = ip.split("[.]")  var ipNum = 0L  for (i ...

  2. 转载:“error LNK1169: 找到一个或多个多重定义的符号”的解决方法

    转载来自:http://www.cnblogs.com/A-Song/archive/2012/03/23/2413782.html 问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. ...

  3. 阿里巴巴开源项目: canal

    参考:https://www.cnblogs.com/duanxz/p/5062833.html docker 部署canal :  https://blog.csdn.net/u013705066/ ...

  4. kubernetes添加删除重启节点

    1.添加节点 (master)查看目前节点 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-maste ...

  5. java 常用第3方工具

    https://www.cnblogs.com/chenpi/p/5608628.html#_label4

  6. 尚硅谷redis学习8-事务

    是什么? 能干嘛? 常用命令 案例说明 1.正常执行 2.放弃事务 3.全部放弃(全体连坐) 4.只抛弃错误(冤头债主) 5.watch监控 悲观锁 悲观锁(Pessimistic Lock), 顾名 ...

  7. Delphi XE8 中TIdTCPClient的WriteLn编码变化!

    //XE2中正常的代码: IdTCPClient1.IOHandler.WriteLn(sendData,TEncoding.ANSI); //XE8中不行了,解决方法: //,引入“IdGlobal ...

  8. Pycharm 字体大小快捷方式设置

    1.File->Settings 2.在搜索框搜索increase 点击Increase Font Size(增大字体)右键选择 Add Mouse Shortcut 然后按Ctrl并且鼠标滚轮 ...

  9. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  10. Haskell语言学习笔记(74)GADTs

    GADTs GADTs(Generalised Algebraic Data Types,广义代数数据类型)是对代数数据类型的一种扩展. 它允许在定义数据类型时明确指定类型参数的类型并使用模式匹配. ...