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


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

#include<iostream>
#include<cmath>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std; const double INF=100000000.0; struct Point
{
double x;
double y;
}p[205]; bool visited[205];
int n;
double d[205];
double map[205][205];
double getLen(Point p1,Point p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
void Dijkstra(){
int i,j,u;
double temp;
visited[0]=true;
for(i=0;i<n;i++)
d[i]=map[0][i];
for(i=1;i<n;i++)
{
temp=INF;
for(j=0;j<n;j++)
if(!visited[j]&&d[j]<temp)
{
temp=d[j];
u=j;
}
visited[u]=true;
for(j=0;j<n;j++)
if(!visited[j])
{
temp=d[u]+map[u][j];
if(temp<d[j])
d[j]=temp;
}
}
}
int main()
{
int i,j;
double temp;
bool flag=false;
scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y); //起始位置和目的地坐标
n=2;
memset(map,0,sizeof(map));
while(~scanf("%lf%lf",&p[n].x,&p[n].y))
{
if(p[n].x==-1&&p[n].y==-1)
{
flag=false;
continue;
}
if(flag) //有效的处理了只输入第一个点时不产生线段
{
temp=getLen(p[n],p[n-1])/40000.0; //存储的是时间(小时),地铁的速度是40km/h
map[n][n-1]=map[n-1][n]=temp;
}
n++;
flag=true;
}
//得到所有步行段的距离 一共n(2+(n-2))个点
for(i=0;i<n;i++) //计算需要步行的所用的时间
for(j=0;j<n;j++)
if(i!=j&&map[i][j]==0.0)//初始是0.0(步行段)
map[i][j]=map[j][i]=getLen(p[i],p[j])/10000.0; //步行的速度是10km/h memset(visited,0,sizeof(visited));
//Dijkstra算法求解最短路
Dijkstra(); //题目所要求的单位是分钟
printf("%0.0lf\n",60.0*d[1]);
return 0;
}

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

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. c#自定义进度条

    有些时候我们做的程序需要进度条,而vs提供的控件不是我们想要的.先看效果图:       进度条闪烁动画,当然背景可设为Transparent 之前想手绘进度条线条的,结果控件运行时会闪烁,所以直接用 ...

  2. PeopleSoft Related Language Records

    As we all know, PeopleSoft is capable of maintaining application data in multiple languages within t ...

  3. C# 多线程运用

    没有用过多线程,所以没有过多的了解操作原理以及怎么编写多线程 后来才只知道将一个传入的集合分别拆开为N个集合来进行使用 //分线程执行 public static void OperateThread ...

  4. ASP.NET中实现页面间的参数传递

    ASP.NET中实现页面间的参数传递   编写人:CC阿爸 2013-10-27 l  近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...

  5. Silverlight - GPU加速

    1. 在Silverlight plug-in上设置 <param name="enableGPUAcceleration" value="true" / ...

  6. NetCat使用手册

    简介:   在网络工具中有“瑞士军刀”美誉的NetCat(以下简称nc),在我们用了N年了至今仍是爱不释手.因为它短小精悍(这个用在它身上很适合,现在有人已经将其修改成大约10K左右,而且功能不减少) ...

  7. MongoDB工具介绍

    在Windows下面,mongodb就只有一个bin目录以及bin目录以外的三个文件,相对bin目录中包括了如下文件: bsondump.exe 用于将导出的BSON文件格式转换为JSON格式 mon ...

  8. 13)Java static

    1.static变量      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是:    ...

  9. Laravel 5 基础(十)- 日期,Mutator 和 Scope

    在我们前面的解决方案中,直接给 published_at 赋值为当前日期实际上是一个临时解决方案,我们需要设定发布日期,可能是未来2天后才发布,让我们修改这个问题. 首先修改控制器: public f ...

  10. 小课堂week13 Clean Code Part2

    Clean Code Part2 对象与数据结构 首先让我们进行一个严肃的思考,对象与数据结构的区别在哪里? 如下两段代码分别用数据结构和对象的方法来描述了一个Point. public class ...