题目链接: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. python 求3到8位数的水仙花数Pycharm实现

    #-*- coding: utf-8-*-import timeimport math#获取3位数的水仙花数start1 = time.time()start = time.time() number ...

  2. MonGoDB 常见操作, 设置管理员和用户登入

    [ 启动客户端 => ./bin/mongo --host 192.168.200.100 ] 1: 查看所有已经创建的数据库  =>  show dbs   2: 切换或者创建数据库   ...

  3. feedparser的安装

    Python中常常要利用RSS下载文本.由于这个Python开源软件嘛,碎片化特别严重.反正是各种边边角角的小问题.网上找来找去找半天都没解决如何安装.我的是win7的.python 是3.4版本的. ...

  4. 最全的select加锁分析(Mysql)

    引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? s ...

  5. Appium -选择、操作元素

    选择界面元素 操作元素(点击.输入字符.拖拽.获取页面元素的各种属性) 根据Appium获取的数据进行分析和处理 desired_capabilities 查看appPackage 和appActiv ...

  6. oracle 修改字符集 为ZHS16GBK

    一.oracle server 端 字符集查询 select userenv('language') from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LANG ...

  7. RESTFUL 设计风格

    RESTFUL  规范总结: Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等广泛流行的标准和协议;轻量级,跨平台,跨语言的架构设计;它是一种设计风格,不是一种标 ...

  8. Lazarus 0.9.26——UTF8编码副作用

    Lazarus 0.9.26中,涉及范围最广的的改变就是所有的的String默认都采用UTF8编码,IDE终于有了完全的UTF8支持,以前在源码编辑器中“吃掉”半个汉字的情况不再出现.对于Linux下 ...

  9. 使用Docker搭建Tomcat运行环境

    1 准备宿主系统 准备一个 CentOS 7操作系统,具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核: # uname -r 2 安装Do ...

  10. CC攻击与DDOS攻击区别

    二者的攻击方式主要分为三种:直接攻击.代理攻击.僵尸网络攻击 CC攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些.这种攻击你见不到虚假IP,见不到特别大的异常流 ...