POJ2502:Subway(最短路)
Subway
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 14634 | Accepted: 4718 |
题目链接:http://poj.org/problem?id=2502
Description:
You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of getting to ride your bike to school every day, you now get to walk and take the subway. Because you don't want 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:
Input consists of the x,y coordinates of your home and your school, followed by specifications of several subway lines. Each subway line consists of the non-negative integer x,y coordinates of each 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:
Output is the number of minutes it will take you to get to school, rounded to the nearest minute, taking the fastest route.
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
题意:
在二维平面上,给出起点和终点的坐标。另外还有多条地铁线路,给出每条线路有哪些站。
如果坐地铁的速度是40km/h,而走路的速度为10km/h,现在问从起点到终点最少花费多少时间。
题解:
直接模拟建边就行了,注意要换算一下单位,因为最后问的是分钟。
有个需要注意的地方就是地铁站之间也可以走路。另外结果四舍五入!!
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <cmath>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = ;
int x,y,X,Y,cnt,num,s,t;
map <ll,map<ll,int> > p;
double d[N];
int vis[N],head[N];
struct node{
int x,y;
};
vector <node> vec[N];
double dis(int X1,int X2,int Y1,int Y2){
return sqrt((double)(X1-X2)*(X1-X2)+(double)(Y1-Y2)*(Y1-Y2));
}
double T(double d,int op){
if(op==) return *d/1000.0;
else return *d/4000.0;
}
struct Edge{
int u,v,next ;
double w;
}e[N*N<<];
int tot;
struct Node{
double d;
int u;
bool operator < (const Node &A)const{
return d>A.d;
}
};
void adde(int u,int v,double w){
e[tot].v=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;
}
void Dijkstra(int s){
priority_queue <Node> q;
for(int i=;i<=t;i++) d[i]=INF;
memset(vis,,sizeof(vis));d[s]=;
Node now;
now.d=;now.u=s;
q.push(now);
while(!q.empty()){
Node cur = q.top();q.pop();
int u=cur.u;
if(vis[u]) continue ;
vis[u]=;
for(int i=head[u];i!=-;i=e[i].next){
int v=e[i].v;
if(d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;
now.d=d[v];now.u=v;
q.push(now);
}
}
}
}
int main(){
cin>>x>>y>>X>>Y;
int xx,yy;
memset(head,-,sizeof(head));
while(scanf("%d",&xx)!=EOF){
scanf("%d",&yy);
cnt++;
node cur;
cur.x=xx;cur.y=yy;
vec[cnt].push_back(cur);
while(){
scanf("%d%d",&xx,&yy);
if(xx==- && yy==-) break ;
cur.x=xx;cur.y=yy;
vec[cnt].push_back(cur);
}
}
s=;t=;
for(int i=;i<=cnt;i++){
for(int j=;j<vec[i].size();j++){
node cur = vec[i][j];
if(p[cur.x][cur.y]==) p[cur.x][cur.y]=++num;
adde(s,p[cur.x][cur.y],T(dis(,cur.x,,cur.y),));
adde(p[cur.x][cur.y],t,T(dis(cur.x,X,cur.y,Y),));
}
}
adde(s,t,T(dis(x,X,y,Y),));
for(int i1=;i1<=cnt;i1++){
for(int j1=;j1<vec[i1].size();j1++){
int len1 = vec[i1].size();
node cur1 = vec[i1][j1];
if(j1>){
node cur2 = vec[i1][j1-];
adde(p[cur1.x][cur1.y],p[cur2.x][cur2.y],T(dis(cur1.x,cur2.x,cur1.y,cur2.y),));
}
if(j1<len1-){
node cur2 = vec[i1][j1+];
adde(p[cur1.x][cur1.y],p[cur2.x][cur2.y],T(dis(cur1.x,cur2.x,cur1.y,cur2.y),));
}
for(int i2=;i2<=cnt;i2++){
for(int j2=;j2<vec[i2].size();j2++){
node cur2 = vec[i2][j2];
adde(p[cur1.x][cur1.y],p[cur2.x][cur2.y],T(dis(cur1.x,cur2.x,cur1.y,cur2.y),));
}
}
}
}
Dijkstra(s);
cout<<(int)(d[t]+0.5);
return ;
}
POJ2502:Subway(最短路)的更多相关文章
- POJ-2502 Subway( 最短路 )
题目链接:http://poj.org/problem?id=2502 Description You have just moved from a quiet Waterloo neighbourh ...
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
- (poj 2502) Subway 最短路
题目链接: 题意:在一个城市里有许多地铁,现在你知道每条地铁的起点 终点与停站点的坐标,知道我们的起始坐标与终点坐标,问加上走路最快到达终点的时间是多少? 方法:求出任意两点的车速时间与步行时间,再 ...
- POJ 2502 Subway ( 最短路 && 最短路建图 )
题意 : 给出二维平面上的两个点代表起点以及终点,接下来给出若干条地铁线路,除了在地铁线路上行进的速度为 40km/h 其余的点到点间都只能用过步行且其速度为 10km/h ,现问你从起点到终点的最短 ...
- poj2502 Subway
思路: 需要注意的地方:一条地铁线路并不一定和样例描述的那样是直的:同一条线路上的两个站点步行可能更快. 实现: #include <iostream> #include <cstd ...
- poj图论解题报告索引
最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...
- POJ 2502 Subway (最短路)
Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...
- POJ-2502(Dijikstra应用+最短路)
Subway POJ-2502 这里除了直接相连的地铁站,其他图上所有的点都要连线,这里是走路的速度. 记住最后的结果需要四舍五入,否则出错. #include<iostream> #in ...
- poj2502 最短路
//Accepted 504 KB 16 ms //spfa最短路 //把n个地铁站作为n个顶点,边权为从一个站到另一个站的时间 //注意:地铁在相邻的两站之间是直线行驶,但其他的就不是了 #incl ...
随机推荐
- python基础数据类型的相关知识点
1.字符串的函数join >>> s = "Hello" >>> s1 = s.join("你好")#将字符串Hello插入 ...
- C errno是否是线程安全的
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/138 在使用多线程时,遇到了一个问题:线程例程中如果需要使用er ...
- kafka重置offset
kafka重置offset 1.删除zookeeper上节点信息 打开client :./zkCli.sh -server 127.0.0.1:12181 删除consumer:rmr /cons ...
- python eval()函数的妙用和滥用
eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果: >>> s='8*8' >>> eval(s) 64 >& ...
- 2007: [Noi2010]海拔
2007: [Noi2010]海拔 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 分析: 平面图最小割. S在左下,T在右上,从S到T的一 ...
- jmeter之Synchronizing Timer的理解
该功能类似loadrunner的集合点,一般按照jmeter的树形结构,放在需要设置集合点的请求之前,两个参数的意思,我们先看官网的解释: 大概意思就是: Number of Simulated Us ...
- es6中类的注意事项
class Circle { constructor(radius) { this.radius = radius; Circle.circlesMade++; }; static draw(circ ...
- 不用找了,比较全的signalR例子已经为你准备好了(2)---JqGrid 服务端刷新方式-注释详细-DEMO源码下载
上次用客户端进行数据刷新的方式,和官方的Demo实现存在差异性,今天花了一点时间好好研究了一下后台时时刷新的方式.将写的代码重新update了一次,在这之前找过好多的资料,发现都没有找到好的例子,自己 ...
- 关于相对布局RelativeLayout的各种属性介绍
RelativeLayout相对布局是个人觉得在android布局中比较常用且好用的一个,当然如果想让布局更漂亮是需要多种布局混合搭建的,这里就需要更深入的学习了,在这只介绍下有关相对布局的东西. 相 ...
- Oracle数据库抽数神器toad
使用了toad,再也不怕抽数成各种 文件格式,以及添加分割的数据文件了.百度搜toad,