题目链接: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. QT中控制台程序运行问题

    环境: ubuntu14.04 问题与解决方法: QT中的控制他程序,默认运行方式是直接输出到Output窗口中来.我的程序需要从控制台输入,这时候默认的运行方式就不行了.通过设置工程全选项让它在终端 ...

  2. linux环境运行java项目并有外部引用jar

    eclipse目录结构: linux目录结构: lib目录结构: 其中除了IMT_ENCODING_DSP.jar其余的都是外部引用的jar IMT_ENCODING_DSP.jar是java项目打包 ...

  3. React Native,flexbox布局

    Flexbox布局 flex:使组件在可利用的空间内动态地扩张或收缩.flex:1会使组件撑满空间.当有多个组件都指定了flex的值,那么谁的flex值大谁占得空间就大,占得大小的比例就是flex值的 ...

  4. newCachedThreadPool使用案例

    newCachedThreadPool 缓存默认60s 猜下你的结果 package com.juc.threadpool; import java.util.concurrent.ExecutorS ...

  5. css-选择器性能

    ID选择器 比如#header 类选择器 比如.promo 元素选择器 比如 div 兄弟选择器 比如 h2 + p 子选择器 比如 li > ul 后代选择器 比如 ul a 7. 通用选择器 ...

  6. vue.js 组件引用之初级 之二

    1. template 标签也可以实现替换,这样可以省去script标签了 <!DOCTYPE html> <html lang="en"> <hea ...

  7. 【375】COMP 9021 相关笔记

    1. Python 中的逻辑否定用 not 2. 对于下面的代码直邮输入整数才能运行,无论字符串或者浮点型都会报错 int(input('How many games should I simulat ...

  8. 记录git的初始设置,添加文件,提交文件

    1 初始配置 git config --global user.name ""  //配置用户名 git config --global user.email "&quo ...

  9. Structs复习 Action

    引入jar包 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

  10. IE 11中 onpropertychange失效

    https://msdn.microsoft.com/zh-cn/library/ie/dn265032(v=vs.85).aspx 将突变事件和属性更改事件迁移到突变观察者 Internet Exp ...