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. .Net多线程编程—同步机制

    1.简介 新的轻量级同步原语:Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait.轻量级同步原语只能 ...

  2. Jmeter对基于websocket协议的压力测试

      WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).   浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就 ...

  3. 编译 MVC View

    默认MVC的 View页面 不参与编译,当更改view对应model后,view编译也能通过,或者页面有错误的服务端代码时也不会报错. 那么如何在编译的时候能让View中的错误也不能通过呢.经过查找找 ...

  4. 【.NET】Linq几样特点

    LinQ 是 .net framework 3.5的技术,对集合的查询和操作十分方便,结合LinQ Provider ,可以更方便操作XML和SQL(或Entity). LinQ有6样常用的特性: 自 ...

  5. 为什么说2017全球云计算大会中国站 (Cloud Connect China 2017)不得不参加?

    2017全球云计算大会中国站将继续关注全球云计算产业现状及最热门的领域,设立主题论坛.2017全球云计算大会中国站将于2017年9月5-7日在上海世博展览馆.正如去年9月活动现场所预告的,2017年除 ...

  6. [DP之多重背包优化方法]

    首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ...

  7. 实时控制软件第一周 汽车ABS系统软件分析

    abs系统简介 在踩急刹车的时候,若没有额外的控制,容易使车轮完全停止转动,从而出现车轮打滑,车轮导向作用丧失的危险情况. abs系统的作用是在驾驶员完全踩住制动踏板的情况下,通过实时地测量车轮转速, ...

  8. [MFC] 编辑框 EditControl 输入数字范围限制

    在MFC中,项目需要对编辑框EditControl的数字输入范围进行限制,主要有以下实现方式,各有优缺点,个人推荐第三种. 第一种:添加变量 为编辑框添加int.float变量的时候,可以填写最大值与 ...

  9. 谷歌游览器对<input type='file'> change只能响应1次解决和样式的改变

    在项目过程中遇到的需要上传本地文件,file的原始控件不太美观,但是这个控件和button有点不太一样, 改变这个样式的思路就是在控件外面套一层链接,然后把file控件的透明度设置为0(透明).样式只 ...

  10. CodeForces 707B Bakery

    枚举. 枚举每一条边,如果发现边的一端$f[u]=1$,另一端$f[v]=0$,那么更新答案,取最小值就好了. #pragma comment(linker, "/STACK:1024000 ...