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 本题要求你实现一个天梯赛专属在线地图,队员输 ...
随机推荐
- linux path 与 classpath 区别
一.OS依据path中的路径信息来寻找可执行指令: 例如: cat /etc/profile 我们就可以在任意目录执行hadoop / hdfs / yarn / java 等相关命令了 export ...
- hive 索引
hive 有限的支持索引,不支持主键外键,可以对表添加索引,也可以为某个分区添加索引.维护索引也要额外的存储空间和计算资源. 创建索引需要指定索引处理器 如 as 'org.apache.hadoop ...
- 白鹭引擎 - 矢量绘图 ( graphics )
class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...
- delphi treeview checkbox
delphi treeview checkbox 最新版Berlin还没有带checkbox的treeview?
- Turn the Rectangles 1008B
output standard output There are nn rectangles in a row. You can either turn each rectangle by 9090 ...
- VsCode 使用习惯设置(备份)
{ "window.menuBarVisibility": "toggle", "workbench.statusBar.visible": ...
- Unity 菜单拓展
添加自定义菜单项 [MenuItem("test/item1 %g")] public static void haha() { Debug.Log("this is a ...
- 自行编译mwan加入openwrt里
参考源文:http://www.right.com.cn/forum/thread-124449-1-1.html 本例以 opoenwrt 12.09正式版为例,原软件来自openwrt 英文论坛: ...
- C#格式化数值结果表(格式化字符串)
字符 说明 示例 输出 C 货币 string.Format("{0:C3}", 2) $2.000 D 十进制 string.Format("{0:D3}", ...
- tf.Variable和tensor的区别(转)
刷课过程中思考到Variable和Tensor之间的区别,尝试发现在如下代码中: a = tf.Variable(tf.ones(1)) b = tf.add(a,tf.ones(1)) 1 2 a是 ...