L3-007. 天梯地图

题目链接:https://www.patest.cn/contests/gplt/L3-007

Dijstra

这题是Dijstra的变形,麻烦的是两种最短路的相同距离时的选择条件不同,也就是说要写两个Dijstra函数。很早就写完了代码,不过debug了一星期,最后还是参考他人博客才知道自己错哪了= =(易错点已注释)

代码如下:

 #include<cstdio>
#include<cstring>
#include<stack>
#define N 505
using namespace std;
const int INF=0x3f3f3f3f;
bool mark[N];
int n,Start,End;
int lenmp[N][N];
int timemp[N][N];
int lendis[N];
int timedis[N];
int lenpre[N];
int timepre[N];
void lenDijstra();
void timeDijstra();
int main(void){
/**输入**/
memset(lenpre,-,sizeof(lenpre));
memset(timepre,-,sizeof(timepre));
int m;
scanf("%d%d",&n,&m);
for(int i=;i<n;++i){
lendis[i]=INF;
timedis[i]=INF;
for(int j=;j<n;++j){
lenmp[i][j]=INF;
timemp[i][j]=INF;
}
}
while(m--){
int a,b,one,length,time;
scanf("%d%d%d%d%d",&a,&b,&one,&length,&time);
if(one){
lenmp[a][b]=length;
timemp[a][b]=time;
}else{
lenmp[a][b]=lenmp[b][a]=length;
timemp[a][b]=timemp[b][a]=time;
}
}
scanf("%d%d",&Start,&End);
/**数据处理**/
lenDijstra();
timeDijstra();
/**输出**/
int k=End;
bool flag=;
stack<int>times;
while(k!=Start){
times.push(k);
if(timepre[k]!=lenpre[k])flag=;
k=timepre[k];
}
if(flag){
printf("Time = %d;",timedis[End]);
printf(" Distance = %d:",lendis[End]);
printf("% d",Start);
while(!times.empty()){
printf(" => %d",times.top());
times.pop();
}
printf("\n");
}else{
printf("Time = %d:",timedis[End]);
printf("% d",Start);
while(!times.empty()){
printf(" => %d",times.top());
times.pop();
}
printf("\n");
printf("Distance = %d:",lendis[End]);
printf("% d",Start);
stack<int>diss;
k=End;
while(k!=Start){
diss.push(k);
k=lenpre[k];
}
while(!diss.empty()){
printf(" => %d",diss.top());
diss.pop();
}
printf("\n");
}
return ;
}
void lenDijstra(){
int node[N];
memset(node,,sizeof(node));
node[Start]=; memset(mark,,sizeof(mark));
lendis[Start]=;
while(){
int Min=INF,index;
for(int i=;i<n;++i){
if(mark[i]&&Min>lendis[i]){
Min=lendis[i];
index=i;
}
}
if(Min==INF)break;
mark[index]=;
for(int i=;i<n;++i){
int d=lendis[index]+lenmp[index][i];
if(mark[i]&&lendis[i]>d){
lendis[i]=d;
lenpre[i]=index;
node[i]=node[index]+; /*非node[i]++*/
}else if(mark[i]&&lendis[i]==d&&node[index]+<node[i]){
lenpre[i]=index;
node[i]=node[index]+;
}
}
}
}
void timeDijstra(){
memset(mark,,sizeof(mark));
int dis[N];
for(int i=;i<n;++i)
dis[i]=lenmp[Start][i];
timedis[Start]=;
dis[Start]=;
while(){
int Min=INF,index;
for(int i=;i<n;++i){
if(mark[i]&&Min>timedis[i]){
Min=timedis[i];
index=i;
}
}
if(Min==INF)break;
mark[index]=;
for(int i=;i<n;++i){
int t=timedis[index]+timemp[index][i];
int d=dis[index]+lenmp[index][i];
if(mark[i]&&timedis[i]>t){
dis[i]=d;
timedis[i]=t;
timepre[i]=index;
}else if(mark[i]&&timedis[i]==t&&dis[i]>d){
dis[i]=d;
timepre[i]=index;
}
}
}
}

L3-007. 天梯地图的更多相关文章

  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. pat 团体天梯赛 L3-007. 天梯地图

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

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

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

  5. PAT L3-007 天梯地图

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

  6. L3-007 天梯地图 (30 分) dijkstra

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

  7. PTA天梯地图

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

  8. pta 天梯地图 (Dijkstra)

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

  9. PAT天梯赛L3-007 天梯地图

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

随机推荐

  1. jQuery+HTML5声音提示

    WEB应用中,有时需要播放特定的声音,比如有新消息或者在线聊天消息声音提示,以前我们通过flash实现,今天我们将使用jQuery和HTML5结合示例来实现如何把声音提示带入WEB应用中. 在本例中, ...

  2. WebADI应用到Office 2016 64-bit

    升级后的用户环境: Windows 2016 bit Office 2016 64 bit IE 11 64 bit 功能定义 功能:CUX_LINE_IMP_ADI 类型:SSWA servlet ...

  3. 【C#】Switch datatype between object and byte[]

    This sample shows how to turn object to byte[], as well as turn byte[] to object. So,I can turn any ...

  4. action = "#" 是什么意思 在HTML语言中

    action = "#" 是form标签的属性,代表提交数据到本页,如:// 提交数据到a.aspx页面<form action="a.aspx"> ...

  5. jQuery事件命名空间

    先看一些代码: 也可以用bind进行事件绑定.我们看到上面的代码,我们可以在事件后面,以点号,加我们的名字,就是事件命名空间.所谓事件命名空间,就是事件类型后面以点语法附加一个别名,以便引用事件,如& ...

  6. 读取Oracle表结构数据

    <html lang="zh-cn"> <head> <meta name="generator" content="O ...

  7. android中edittext被键盘挡住问题

    最近开始新项目,做注册页时候由于ui布局问题,edittext被键盘挡住了. 在stackoverflow上找了一遍,有提到在对应activity中设置windowSoftInputMode, 例如: ...

  8. nio简介

    上一篇  Java I/O演进与Linux网络I/O模型 一.传统BIO java传统bio编程概念: http://www.cnblogs.com/carl10086/p/6034563.html# ...

  9. Zookeeper,Kafka,Spark关系

    Kafka中ZooKeeper的用途 正如ZooKeeper用于分布式系统的协调和促进,Kafka使用ZooKeeper也是基于相同的原因.ZooKeeper用于管理.协调Kafka代理.每个Kafk ...

  10. syntaxhighlighter的使用

    第一 解压压缩包,scripts文件夹中包含了各种语言的JS文件,在styles文件夹中是各种显示高亮的主题 第二 如何使用?首先要引入其核心javascript文件shCore.js和核心CSS文件 ...