POJ 2502 Subway (Dijkstra 最短+建设规划)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 6689 | Accepted: 2176 |
Description
to be late for class, you want to know how long it will take you to get to school.
You walk at a speed of 10 km/h. The subway travels at 40 km/h. Assume that you are lucky, and whenever you arrive at a subway station, a train is there that you can board immediately. You may get on and off the subway any number of times, and you may switch
between different subway lines if you wish. All subway lines go in both directions.
Input
stop on the line, in order. You may assume the subway runs in a straight line between adjacent stops, and the coordinates represent an integral number of metres. Each line has at least two stops. The end of each subway line is followed by the dummy coordinate
pair -1,-1. In total there are at most 200 subway stops in the city.
Output
Sample Input
0 0 10000 1000
0 200 5000 200 7000 200 -1 -1
2000 600 5000 600 10000 600 -1 -1
Sample Output
21
Source
题目链接:
id=2502">http://poj.org/problem?id=2502
题目大意:第一行给出起点和终点坐标,然后每一行是一个地铁线,用坐标表示,以-1 -1表示该条线路输入完成。注意单位是米!
每条线路都是直线双向。地铁时速40km/h,人步行速度10km/h,地铁仅仅能在相邻两站间行使,不能直接从第i站到第i+2站。若该人一到地铁站就有地铁坐,问其从起点到终点的最少须要几分钟
题目分析:此题的输入建图比較麻烦。每条地铁线我们要单独处理。笛卡尔距离 / 地铁速(40km/h)作为边权,处理完每条线,再处理其它点之间的边权,笛卡儿距离 / 人速(10km/h),然后就是裸的最短路问题,用Dijkstra求解,注意3个问题。第1:单位的换算,第2:结果要求四舍五入,第3:无穷大设置为double型!
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 405;
int const INF = 100000000.0; struct Node
{
double u, v;
}nd[MAX]; double dis[MAX], e[MAX][MAX];
bool vis[MAX];
int cnt; double get_dis(double x1, double y1, double x2, double y2)
{
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
} void Dijkstra(int v0)
{
for(int i = 0; i < cnt; i++)
dis[i] = e[v0][i];
dis[v0] = 0;
vis[v0] = true;
for(int i = 0; i < cnt - 1; i++)
{
double mi = INF;
int u = v0;
for(int j = 0; j < cnt; j++)
{
if(!vis[j] && mi > dis[j])
{
u = j;
mi = dis[j];
}
}
vis[u] = true;
for(int k = 0; k < cnt; k++)
if(!vis[k] && dis[k] > dis[u] + e[u][k])
dis[k] = dis[u] + e[u][k];
}
} int main()
{
memset(vis, false, sizeof(vis));
memset(e, 0, sizeof(e));
scanf("%lf %lf %lf %lf", &nd[0].u, &nd[0].v, &nd[1].u, &nd[1].v);
double u, v;
int tmp = 2;
cnt = 2;
while(scanf("%lf %lf", &u, &v) != EOF)
{
if(u == -1.0 && v == -1.0)
{
for(int i = tmp; i < cnt - 1; i++)
{
double get = get_dis(nd[i].u, nd[i].v, nd[i + 1].u, nd[i + 1].v) / 40000.0;
e[i][i + 1] = e[i + 1][i] = get;
}
tmp = cnt;
continue;
}
nd[cnt].u = u;
nd[cnt++].v = v;
}
for(int i = 0; i < cnt; i++)
for(int j = i + 1; j < cnt; j++)
if(e[i][j] == 0)
e[i][j] = e[j][i] = get_dis(nd[i].u, nd[i].v, nd[j].u, nd[j].v) / 10000.0;
Dijkstra(0);
printf("%d\n", (int)(dis[1] * 60.0 + 0.5));
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
POJ 2502 Subway (Dijkstra 最短+建设规划)的更多相关文章
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- 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 ...
- Dijkstra+计算几何 POJ 2502 Subway
题目传送门 题意:列车上行驶40, 其余走路速度10.问从家到学校的最短时间 分析:关键是建图:相邻站点的速度是40,否则都可以走路10的速度.读入数据也很变态. #include <cstdi ...
- (简单) POJ 2502 Subway,Dijkstra。
Description You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of ...
- poj 2502 Subway【Dijkstra】
<题目链接> 题目大意: 某学生从家到学校之间有N(<200)条地铁,这个学生可以在任意站点上下车,无论何时都能赶上地铁,可以从一条地铁的任意一站到另一条地跌的任意一站,学生步行速度 ...
- POJ 2502 Subway(迪杰斯特拉)
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6692 Accepted: 2177 Descriptio ...
- POJ 2502 Subway
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4928 Accepted: 1602 Descriptio ...
- POJ 2502 Subway (最短路)
Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...
- POJ 2502 Subway ( 最短路 && 最短路建图 )
题意 : 给出二维平面上的两个点代表起点以及终点,接下来给出若干条地铁线路,除了在地铁线路上行进的速度为 40km/h 其余的点到点间都只能用过步行且其速度为 10km/h ,现问你从起点到终点的最短 ...
随机推荐
- onsubmit事件
var oForm = document.getElementById("form1"); oForm.onsubmit = function(){ alert("你 ...
- Swing中弹出对话框的几种方式(转)
http://www.cnblogs.com/mailingfeng/archive/2011/12/28/2304289.html 在swing中,基于业务的考量,会有对话框来限制用户的行为及对用户 ...
- poj Firing(最大重量封闭图)
Firing 题目: 要解雇一些人,而解雇的这些人假设人跟他有上下级的关系,则跟他有关系的人也要一起解雇.每一个人都会创造一定的价值,要求你求出在最大的获利下.解雇的人最小. 算法分析: 在这之前要知 ...
- Base64加密解密原理以及代码实现
1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符. 2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...
- Snail—ORACLE基础之事务学习(五)
---------------事务---当运行到commit时 事务才算是完毕,不然 会运行rollback操作. declare v_money acount.money%type:=1223; e ...
- Oracle批量执行脚本文件
以下是Oracle批量执行脚本文件的步骤和方法 1.创建脚本文件(xx.sql): 例如文件CreateTable Create table tb1( id varchar2(30), Name va ...
- Appium之java API
AppiumDriver getAppStrings() 默认系统语言相应的Strings.xml文件内的数据. driver.getAppStrings(String language) 查找某一个 ...
- java注意事项演示 地图产生表 演示样本 来自thinking in java 4 20代码的章
java注意事项演示 地图产生表 演示样本 来自thinking in java 4 20代码的章 thinking in java 4免费下载:http://download.csdn.net/d ...
- LightOJ 1205 Palindromic Numbers
数位DP.... Palindromic Numbers Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %l ...
- 无法Debug SQL: Unable to start T-SQL Debugging. Could not attach to SQL Server process on
今天SSMS debug SQL当脚本,突然错误: Unable to start T-SQL Debugging. Could not attach to SQL Server process on ...