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

输入格式:

输入在第一行给出两个正整数N(2 ≤≤ N ≤≤ 500)和M,分别为地图中所有标记地点的个数和连接地点的道路条数。随后M行,每行按如下格式给出一条道路的信息:

  1. V1 V2 one-way length time

其中V1V2是道路的两个端点的编号(从0到N-1);如果该道路是从V1V2的单行线,则one-way为1,否则为0;length是道路的长度;time是通过该路所需要的时间。最后给出一对起点和终点的编号。

输出格式:

首先按下列格式输出最快到达的时间T和用节点编号表示的路线:

  1. Time = T: 起点 => 节点1 => ... => 终点

然后在下一行按下列格式输出最短距离D和用节点编号表示的路线:

  1. Distance = D: 起点 => 节点1 => ... => 终点

如果最快到达路线不唯一,则输出几条最快路线中最短的那条,题目保证这条路线是唯一的。而如果最短距离的路线不唯一,则输出途径节点数最少的那条,题目保证这条路线是唯一的。

如果这两条路线是完全一样的,则按下列格式输出:

  1. Time = T; Distance = D: 起点 => 节点1 => ... => 终点

输入样例1:

  1. 10 15
  2. 0 1 0 1 1
  3. 8 0 0 1 1
  4. 4 8 1 1 1
  5. 5 4 0 2 3
  6. 5 9 1 1 4
  7. 0 6 0 1 1
  8. 7 3 1 1 2
  9. 8 3 1 1 2
  10. 2 5 0 2 2
  11. 2 1 1 1 1
  12. 1 5 0 1 3
  13. 1 4 0 1 1
  14. 9 7 1 1 3
  15. 3 1 0 2 5
  16. 6 3 1 2 1
  17. 5 3

输出样例1:

  1. Time = 6: 5 => 4 => 8 => 3
  2. Distance = 3: 5 => 1 => 3

输入样例2:

  1. 7 9
  2. 0 4 1 1 1
  3. 1 6 1 3 1
  4. 2 6 1 1 1
  5. 2 5 1 2 2
  6. 3 0 0 1 1
  7. 3 1 1 3 1
  8. 3 2 1 2 1
  9. 4 5 0 2 2
  10. 6 5 1 2 1
  11. 3 5

输出样例2:

  1. Time = 3; Distance = 4: 3 => 2 => 5
  1. Dijkstra ,条件比较多,最短路和最短时间两次分开就行。
  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <algorithm>
  6. #include <math.h>
  7. #include <string>
  8. #include <map>
  9. #include <queue>
  10. using namespace std;
  11. const int maxn=1e5;
  12. struct Node
  13. {
  14.     int value;
  15.     int next;
  16.     int dis;
  17.     int time;
  18. }edge[maxn*4+5];
  19. int head[maxn+5];
  20. int tot;
  21. void join(int x,int y,int d,int t)
  22. {
  23.     edge[tot].value=y;
  24.     edge[tot].next=head[x];
  25.     edge[tot].dis=d;
  26.     edge[tot].time=t;
  27.     head[x]=tot++;
  28. }
  29. int vis[maxn+5];
  30. int ans,res;
  31. struct node
  32. {
  33.     int x;
  34.     int dis;
  35.     int num;
  36.     int time;
  37.     node(){};
  38.     node(int x,int dis,int num,int time)
  39.     {
  40.         this->x=x;
  41.         this->dis=dis;
  42.         this->num=num;
  43.         this->time=time;
  44.     }
  45.     friend bool operator <(node a,node b)
  46.     {
  47.         return a.dis>b.dis;
  48.     }
  49. };
  50. int d[maxn+5];
  51. int d2[maxn+5];
  52. int num[maxn+5];
  53. int t[maxn+5];
  54. int ansd[maxn+5];
  55. int anst[maxn+5];
  56. int n;
  57. int v1,v2;
  58. void Dijkstra(int v1,int v2)
  59. {
  60.     priority_queue<node> q;
  61.     for(int i=0;i<=n;i++)
  62.         d[i]=t[i]=1e9;
  63.     memset(vis,0,sizeof(vis));
  64.     num[v1]=0;
  65.     d[v1]=t[v1]=0;
  66.     ansd[v1]=-1;
  67.     anst[v1]=-1;
  68.     while(!q.empty())
  69.         q.pop();
  70.     q.push(node(v1,0,0,0));
  71.     while(!q.empty())
  72.     {
  73.         node term=q.top();
  74.         q.pop();
  75.         if(term.x==v2)
  76.         {
  77.             break;
  78.         }
  79.         for(int i=head[term.x];i!=-1;i=edge[i].next)
  80.         {
  81.             int v=edge[i].value;
  82.             if(d[v]>term.dis+edge[i].dis)
  83.             {
  84.                 d[v]=term.dis+edge[i].dis;
  85.                 num[v]=term.num+1;
  86.                 q.push(node(v,d[v],term.num+1,0));
  87.                 ansd[v]=term.x;
  88.             }
  89.             else if(d[v]==term.dis+edge[i].dis)
  90.             {
  91.                 if(num[v]>term.num+1)
  92.                 {
  93.                     num[v]=term.num+1;
  94.                     ansd[v]=term.x;
  95.                     q.push(node(v,d[v],term.num+1,0));
  96.                 }
  97.             }
  98.         }
  99.     }
  100.     while(!q.empty())
  101.         q.pop();
  102.     q.push(node(v1,0,0,0));
  103.     d2[v1]=0;
  104.     while(!q.empty())
  105.     {
  106.         node term=q.top();
  107.         q.pop();
  108.         if(term.x==v2)
  109.         {
  110.             break;
  111.         }
  112.         for(int i=head[term.x];i!=-1;i=edge[i].next)
  113.         {
  114.             int v=edge[i].value;
  115.             if(t[v]>term.dis+edge[i].time)
  116.             {
  117.                 t[v]=term.dis+edge[i].time;
  118.                 d2[v]=term.time+edge[i].dis;
  119.                 q.push(node(v,t[v],0,d2[v]));
  120.                 anst[v]=term.x;
  121.             }
  122.             else if(t[v]==term.dis+edge[i].time)
  123.             {
  124.                 if(d2[v]>term.time+edge[i].dis)
  125.                 {
  126.                     d2[v]=term.time+edge[i].dis;
  127.                     q.push(node(v,t[v],0,d2[v]));
  128.                     anst[v]=term.x;
  129.                 }
  130.             }
  131.         }
  132.     }
  133. }
  134. int fun3(int x)
  135. {
  136.     if(x==-1)
  137.         return 1;
  138.     if(ansd[x]!=anst[x])
  139.         return 0;
  140.     return fun3(ansd[x]);
  141. }
  142. void fun(int x)
  143. {
  144.     if(x==-1)
  145.         return;
  146.     fun(ansd[x]);
  147.     if(x==v2)
  148.         printf("%d",x);
  149.     else
  150.         printf("%d => ",x);
  151. }
  152. void fun2(int x)
  153. {
  154.     if(x==-1)
  155.         return;
  156.     fun2(anst[x]);
  157.     if(x==v2)
  158.         printf("%d",x);
  159.     else
  160.         printf("%d => ",x);
  161. }
  162. int m,k;
  163. int main()
  164. {
  165.     scanf("%d%d",&n,&m);
  166.     int x,y,dd,tt,ta;
  167.     memset(head,-1,sizeof(head));
  168.     memset(vis,0,sizeof(vis));
  169.     tot=0;
  170.     for(int i=1;i<=m;i++)
  171.     {
  172.         scanf("%d%d%d%d%d",&x,&y,&ta,&dd,&tt);
  173.         join(x,y,dd,tt);
  174.         if(ta==0)
  175.         join(y,x,dd,tt);
  176.     }
  177.     scanf("%d%d",&v1,&v2);
  178.     Dijkstra(v1, v2);
  179.     if(fun3(v2)==1)
  180.     {
  181.         printf("Time = %d; Distance = %d: ",t[v2],d[v2]);
  182.         fun2(v2);
  183.         printf("\n");
  184.         return 0;
  185.     }
  186.     printf("Time = %d: ",t[v2]);
  187.     fun2(v2);
  188.     printf("\n");
  189.     printf("Distance = %d: ",d[v2]);
  190.     fun(v2);
  191.     printf("\n");
  192.     return 0;
  193. }

pta 天梯地图 (Dijkstra)的更多相关文章

  1. PTA天梯地图

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

  2. PTA天梯 L3-007 天梯地图

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

  3. CCCC L2-001 紧急救援 floyd改的dijkstra模板 (记录路径) L3 天梯地图

    https://www.patest.cn/contests/gplt/L2-001 题解:求最短路的条数,并输出点的权值最大的路径,用priority_queue会wa两个点,原因不明. 于是又学了 ...

  4. L3-007. 天梯地图

    L3-007. 天梯地图 题目链接:https://www.patest.cn/contests/gplt/L3-007 Dijstra 这题是Dijstra的变形,麻烦的是两种最短路的相同距离时的选 ...

  5. pat 团体天梯赛 L3-007. 天梯地图

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

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

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

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

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

  8. pta l3-7(天梯地图)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 题意:给定n个地点,m条边以及边的 ...

  9. 天梯赛练习 L3-007 天梯地图 (30分) Dijkstra

    题目分析: 本题的题意比较清晰,就是有一个起点和一个终点,给出m条路径,可能是单向的可能是双向的,同时一条路有两个权重,分别是通过这条路需要的时间和这条路的路径长度,题目需要求出两条路径,一条是在最快 ...

随机推荐

  1. spring复习 -day1:Spring简介 、 Spring容器 、 Spring IOC

    Spring创建对象方法   创建对象过程: 第一步:添加SpringIOC环境 (1)在WebRoot/WEB-INT/lib文件夹下,引入SpringIOC配置环境的jar包 如图: (2)在sr ...

  2. HttpClient学习之 客户端HTTP编程入门

    说明 本文存在的原因,是想深入的学习下HttpClient.对应的网址是: http://hc.apache.org/httpcomponents-client-4.5.x/primer.html h ...

  3. windows 解压缩命令

    首先安装winrar 压缩: 命令:start winrar a test test.py 解压: 命令:start winrar x -y test.rar F:\batShell\test\tes ...

  4. JavaStuNote 5

    接口 (interface) 一个抽象类,全部的方法都是抽象的,全部方法的public, 我们把这种类叫做极度抽象类,是最干瘪的类. public abstract class A { public  ...

  5. 如何用ChemDraw建立多中心结构

    通过调整ChemDraw多中心机构的连接可绘制有意义的络合物结构,建立中心原子和络合配体后,利用多中心化学键连接上述结构即可.以下内容将具体介绍如何用ChemDraw建立多中心结构. 一.多中心键和多 ...

  6. 【matlab】输出显示函数 sprintf()&disp()

    disp()功能类似于c语言中的print:java语言中的System.out.println(): Matlab的disp()函数  : 1.输出字符串: >>disp('my tes ...

  7. pcduino 无法打开usb摄像头。

    1.sudo ./demon   http://www.oschina.net/question/994181_118098 2.usb camera interfarce switch :http: ...

  8. Java------遍历Map<k,v>的方法

    1. public class MapAction extends ActionSupport{ private Map<String, User> map = new HashMap&l ...

  9. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 12 in XML document from

    org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 12 in XML document from ...

  10. ionic ui框架及creator使用帮助

    UI框架使用方法:http://ionicframework.com/docs/api/ PS:路由之类的其他js代码示例建议用 官方的app 生成器弄一个简单的页面,然后下载回来看 https:// ...