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. java基础练习 5

    import java.util.Scanner; public class Fifth { /*输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组.*/ public static ...

  2. 使用pip安装报错的处理方法_2

    终端更新pip出错 sudo pip install --upgrade pip : 1.ReadTimeoutError: HTTPSConnectionPool(host='pypi.Python ...

  3. Linux上传与下载(sz-rz)

    linux使用rz和sz命令上传和下载文件! sz命令发送文件到本地: # sz filename rz命令本地上传文件到服务器: # rz 执行该命令后,在弹出框中选择要上传的文件即可. 说明:打开 ...

  4. trove 开发者阅读翻译

    介绍 Trove为OpenStack提供数据库的服务.它的设计运行完全符合OpenStack,目标是让用户能快速.轻松地利用关系数据库的特点,没有负担的处理复杂的管理任务.云用户和数据库管理员可以根据 ...

  5. 长安大学ACM竞赛部

    本博客为长安大学ACM竞赛部的公共博客,记录长大ACMer的成长点滴. 开此博客,诸君共勉.

  6. poj 2689 Prime Distance(大区间素数)

    题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...

  7. HDU 1269 迷宫城堡(DFS)

    迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...

  8. Chapter 21_5.2 tab扩展

    在Lua中,像这样()的空白捕获具有特殊意义.表示捕获它在目标字符串中的位置,返回一个数字: print(string.match("hello","()ll()&quo ...

  9. SAP HANA 中的决策表(Decision Table)

    http://scn.sap.com/community/developer-center/hana/blog/2013/01/11/what-can-you-do-with-decision-tab ...

  10. Unity人工智能学习—确定性AI算法之追踪算法二

    转自:http://blog.csdn.net/zhangxiao13627093203/article/details/47658673 上一篇讲到了追踪算法的比较简单的形式,看上去比较假,因为AI ...