题意:
你从家往学校赶,可以用步行和乘坐地铁这两种方式,步行速度为10km/h,乘坐地铁的速度为40KM/h。输入数据的第一行数据会给你起点和终点的x和y的坐标。然后会给你数目不超过200的双向地铁线路的站点,你可以从一个站点乘坐地铁到下一个站点,你可以在同一线路上乘坐地铁经过不同的站点,在不同线路的站点之间,你只能用步行的方式。让你求利用你可以利用的方式,求解到校花费的最短时间。


思路:
基础最短路径问题,Dijkstra算法可以解决。需要特别注意以下输入数据的方式,这道题目没有很明显的输入结束标志,要用scanf()!= EOF来进行判断。然后把图的信息存入 map数组里面,当i到j在一条铁路线路上的时候,用它的距离除以40000来求解时间并存入map[i][j]中,map其他的位置存储不行的时间,然后套用模板直接求解最短路径就可以了。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<string>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. const double INF=100000000.0;
  9.  
  10. struct Point
  11. {
  12. double x;
  13. double y;
  14. }p[205];
  15.  
  16. bool visited[205];
  17. int n;
  18. double d[205];
  19. double map[205][205];
  20. double getLen(Point p1,Point p2){
  21. return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
  22. }
  23. void Dijkstra(){
  24. int i,j,u;
  25. double temp;
  26. visited[0]=true;
  27. for(i=0;i<n;i++)
  28. d[i]=map[0][i];
  29. for(i=1;i<n;i++)
  30. {
  31. temp=INF;
  32. for(j=0;j<n;j++)
  33. if(!visited[j]&&d[j]<temp)
  34. {
  35. temp=d[j];
  36. u=j;
  37. }
  38. visited[u]=true;
  39. for(j=0;j<n;j++)
  40. if(!visited[j])
  41. {
  42. temp=d[u]+map[u][j];
  43. if(temp<d[j])
  44. d[j]=temp;
  45. }
  46. }
  47. }
  48. int main()
  49. {
  50. int i,j;
  51. double temp;
  52. bool flag=false;
  53. scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y); //起始位置和目的地坐标
  54. n=2;
  55. memset(map,0,sizeof(map));
  56. while(~scanf("%lf%lf",&p[n].x,&p[n].y))
  57. {
  58. if(p[n].x==-1&&p[n].y==-1)
  59. {
  60. flag=false;
  61. continue;
  62. }
  63. if(flag) //有效的处理了只输入第一个点时不产生线段
  64. {
  65. temp=getLen(p[n],p[n-1])/40000.0; //存储的是时间(小时),地铁的速度是40km/h
  66. map[n][n-1]=map[n-1][n]=temp;
  67. }
  68. n++;
  69. flag=true;
  70. }
  71. //得到所有步行段的距离 一共n(2+(n-2))个点
  72. for(i=0;i<n;i++) //计算需要步行的所用的时间
  73. for(j=0;j<n;j++)
  74. if(i!=j&&map[i][j]==0.0)//初始是0.0(步行段)
  75. map[i][j]=map[j][i]=getLen(p[i],p[j])/10000.0; //步行的速度是10km/h
  76.  
  77. memset(visited,0,sizeof(visited));
  78. //Dijkstra算法求解最短路
  79. Dijkstra(); //题目所要求的单位是分钟
  80. printf("%0.0lf\n",60.0*d[1]);
  81. return 0;
  82. }

版权声明:本文为博主原创文章,未经博主允许不得转载。

Dijkstra--POJ 2502 Subway(求出所有路径再求最短路径)的更多相关文章

  1. POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)

    POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...

  2. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  3. HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边

    Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...

  4. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

  5. poj 2502 Subway【Dijkstra】

    <题目链接> 题目大意: 某学生从家到学校之间有N(<200)条地铁,这个学生可以在任意站点上下车,无论何时都能赶上地铁,可以从一条地铁的任意一站到另一条地跌的任意一站,学生步行速度 ...

  6. (简单) POJ 2502 Subway,Dijkstra。

    Description You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of ...

  7. Dijkstra+计算几何 POJ 2502 Subway

    题目传送门 题意:列车上行驶40, 其余走路速度10.问从家到学校的最短时间 分析:关键是建图:相邻站点的速度是40,否则都可以走路10的速度.读入数据也很变态. #include <cstdi ...

  8. POJ 2502 Subway(迪杰斯特拉)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 2177 Descriptio ...

  9. POJ 2502 Subway (最短路)

    Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...

随机推荐

  1. MongoDb 与 Nodejs服务器的启动

    1) 启动MongoDB : MongoDB —dbpath databaseNameFolder. 2) 启动数据库 : Mongo DatabaseName. 3) 启动NodeJs: Node ...

  2. Java实现计算20的阶乘

    循环从1乘到20,要注意的就是结果可能会很大,长度超出int类型的范围,所以定义乘积的时候用long. 代码如下: public class Practice3 { public static voi ...

  3. android开源代码

    Android开源项目--分类汇总 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇 包括L ...

  4. delphi函数调用约定

    指令 参数存放位置 参数传递顺序 参数内存管理 使用地方 Register CPU寄存器 从左到右 被调用者 默认,published属性存取方法必须使用 Pascal 栈 从左到右 被调用者 向后兼 ...

  5. 【坑】log4j-over-slf4j.jar AND slf4j-log4j12.jar的冲突问题

    为了解决这个问题,已经有砸电脑的冲动了.通过百度查找都说是Maven依赖的原因,经过各种尝试仍然没有解决,后来终于在QQ群的帮助下,算是暂时过关. [问题] 程序在本地运行没有问题,打成jar包发布到 ...

  6. AppCan应用开发之插件实践篇-支付插件

    电商O2O无疑是目前最受用户欢迎的APP类型,而在这类APP中必不可少的就是在线支付功能了.在AppCan平台开发这类应用时,官方封装了微信支付.支付宝.银联等多种支付SDK,更接入了多家聚合支付平台 ...

  7. Oracle 12c 数据库中scott用户不存在的解决方法

    -- 使用超级管理员登录CONN sys/change_on_install AS SYSDBA ;-- 创建c##scott用户CREATE USER c##scott IDENTIFIED BY ...

  8. Power Map 入门

    Excel 的 Microsoft Power Map是三维 (3-D) 数据的可视化工具,允许您以新的方式看信息.电源映射允许您发现您可能看不到传统的二维 (2-d) 表和图中的见解. 使用Powe ...

  9. C#中的委托与事件

    1,委托? 通俗来讲,就是一个能存放符合某种格式(签名)的方法的指针 的容器  (可以将方法作为一个参数来传递到另一个方法内执行) 定义委托:delegate string DelegateSayHi ...

  10. 开启Objective-C --- OC基础知识

    一.Objective-C简述      Objective-C通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言.Objective-C主要用于:编写iOS操作 ...