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. [ios2]iphone编程中使用封装的NSLog来打印调试信息 【转】

    使用NSLog的一个风险是:它的运行会占用时间和设备资源. 简单而粗暴的解决方案是:在release前,将所有的NSLog注释掉.简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释. ...

  2. Linux学习笔记(一):常用命令(2)

    3.帮助命令 A,帮助命令:man    B,其他帮助命令 3.1,格式:man [命令名] 查看命令拥有哪个级别的帮助:                                       ...

  3. HostingEnvironment RegisterObject和QueueBackgroundWorkItem

    其实网上关于HostingEnvironment 的RegisterObject和QueueBackgroundWorkItem文章已经很多了,典型是的 QueueBackgroundWorkItem ...

  4. MVC源码解析 - 目录

    尽管MVC6和MVC4,5已经有很大不同, 但是, 作为一个普通开发人员, 还真没有资格去选择使用哪个版本. So, 尽管已经是old的版本, 还是再次花点时间去温故知新. 我记得在15年初的时候, ...

  5. IronPython .NET Integration官方文档翻译笔记

    http://ironpython.net/documentation/dotnet/这是原文地址 以下笔记仅记录阅读过程中我认为有必要记录的内容,大多数都是依赖翻译软件的机翻,配合个人对代码的理解写 ...

  6. Docker集群实验环境布署--swarm【1 架构说明】

    在读完<Docker技术入门与实践>这本书后,基本上已对Docker了有一些入门的理解,以及我们为什么要使用Docker 答:我们发现在实际工作中,通过openstack一旦把一个VM创建 ...

  7. svn服务器搭建-SuSE Linux Enterprise Server 11 SP3

    svn存储版本数据也有2种方式: 1.bdb: 2.fsfs. 因为BDB方式在服务器中断时,有可能锁住数据(搞ldap时就深受其害,没法根治),所以还是FSFS方式更安全一点,我也选择这种方式.   ...

  8. jxl 导入excel

    jsp部分 <div class="modal-dialog"> <div class="modal-content"> <div ...

  9. HDU------checksum

    Quicksum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  10. HTML form的一些属性(第一版)

    p,li { white-space: pre-wrap } HTML表单属性总结(第一版) 基本格式为:<input type="类型" name="名字[唯一, ...