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学习笔记:第一天python基础
目录 1. python简介 2. python的安装 3. 编写第一个helloword 4. 变量和常量 5. 数据类型 6. 输入 7. if语句 1. python简介 python是在198 ...
- 6-C++远征之封装篇[上]-学习笔记
C++远征之封装篇(上) 课程简介 类(抽象概念),对象(真实具体) 配角: 数据成员和成员函数(构成了精彩而完整的类) 构造函数 & 析构函数(描述了对象的生生死死) 对象复制和对象赋值 ( ...
- java基础day05---界面
java基础day05---界面 1.GUI:图形用户界面(Graphics User Interface) 开发工具包AWT抽象窗口把工具箱===>swing 解决了awt存在的lcd问题== ...
- Leetcode 简略题解 - 共567题
Leetcode 简略题解 - 共567题 写在开头:我作为一个老实人,一向非常反感骗赞.收智商税两种行为.前几天看到不止两三位用户说自己辛苦写了干货,结果收藏数是点赞数的三倍有余,感觉自己的 ...
- 使用Visual Studio 2017构建.Net Core的Docker镜像
1 Docker 镜像优化 微软在为开发人员生成 Docker 镜像时,提供以下三种主要方案: 用于开发 .NET Core 应用的 镜像 用于构建生成 .NET Core 应用的 镜像 用于运行 ...
- 【连载】Maven系列(四)——配置私服
相关文章 1.<用起来超爽的Maven——入门篇> 2.<用起来超爽的Maven——进阶篇> 3.<Maven系列(三) 进阶> 一.为什么需要私服 有些公司并不提 ...
- Django数据模型--字段详解
一.字段 1.CharField: 字段数据类型为字符串 class Test(models.Model): test = models.CharField(max_length=) 2.Intege ...
- 对 vscode 自动格式化的结果不太满意,我们该如何自己调整直至自己满意为止
前提概述 采用vue-cli 3.0自动生成vue项目,选了ESlint+Prettier,在写request.js的时候,顺手用vscode右击格式化文件(Alt+Shift+F),一下子报了8个问 ...
- day-10 sklearn库实现SVM支持向量算法
学习了SVM分类器的简单原理,并调用sklearn库,对40个线性可分点进行训练,并绘制出图形画界面. 一.问题引入 如下图所示,在x,y坐标轴上,我们绘制3个点A(1,1),B(2,0),C(2,3 ...
- ubuntu 和 centOS 的apache设置
更改ubuntu的网站访问根目录: 在sudo gedit /etc/apache2/sites-enabled/000-default,把 DocumentRoot /var/www #这 ...