L - Subway(最短路spfa)
L - Subway(最短路spfa)
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
思路
- 这一题难在输入和建图,,,,,
- 对于建图,我说一些需要注意的地方:
1.首先 起点要与所有的火车站 建了一条边(起点 -> 火车站)权值为人走过这段距离所用的时间
2.汽车 所有的火车站与终点 建了一条边 (火车站-> 终点)权值为人走过这段距离所用的时间
3. 这题一条最需要注意: 在任意一组 车站点之间,相邻的 站点之间 要建立双向边(权值为:火车的行走的时间)
4. 所有火车站之间应该 也应该建了 双向边,这个边的权值(时间),一定是人走过两个车站的时间
题解一
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define Pir pair<double, double>
const int maxm = 100005;
struct Pos
{
double x,y;
} pos[maxm];
int k = 2;
double Dis(Pos a, Pos b)
{
return sqrt( (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) );
}
struct Edge
{
int v;
double w;
int next;
} edge[maxm];
int head[maxm];
double dis[maxm];
int cnt = 0;
void Add(int u, int v, double w)
{
edge[++ cnt] = (Edge){ v, w, head[u]}; head[u] = cnt;
}
double Spfa(int s, int e)
{
int use[maxm];
for(int i = 0; i <= k; i ++)
dis[i] = INF, use[i] = 0;
dis[s] = 0;
queue<int> q;
q.push(s);
int u,v;
double w;
while(! q.empty())
{
u = q.front(); q.pop();
use[u] = 0;
for(int i = head[u]; i; i = edge[i].next)
{
v = edge[i].v;
w = edge[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(! use[v])
{
q.push(v);
use[v] = 1;
}
}
}
}
return dis[e];
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
//freopen("T.txt","r",stdin);
cin >> pos[0].x >> pos[0].y >> pos[1].x >> pos[1].y;
double x,y;
while(cin >> x >> y)
{
pos[k].x = x; pos[k ++].y = y;
while(cin >> x >> y && (x!=-1 && y!=-1))
{
pos[k].x = x; pos[k].y = y;
Add(k - 1, k, Dis(pos[k-1], pos[k])/2000*3);
Add(k, k - 1, Dis(pos[k], pos[k-1])/2000*3);
k ++;
}
}
for(int i = 0; i < 2; i ++)
{
for(int j = 2; j < k-1; j ++)
{
if(i == 0)
Add(i, j, Dis(pos[i], pos[j])/500*3);
if(i == 1)
Add(j, i, Dis(pos[i], pos[j])/500*3);
}
}
for(int i = 0; i < k; i ++)
for(int j = i + 1; j < k; j ++)
{
Add(i, j, Dis(pos[i], pos[j])/500*3);
Add(j, i, Dis(pos[i], pos[j])/500*3);
}
Add(0, 1, Dis(pos[0], pos[1])/500*3);
cout << int( Spfa(0, 1) + 0.5) << endl;
return 0;
}
题解二(别人的)
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 205;
const double wsp = 10 * 1000 / 60;
const double ssp = 40 * 1000 / 60;
struct Node{
double x, y;
}node[MAXN];
struct ff{
int x, d;
ff(){}
ff( int a, double b ){ x = a; d = b; }
bool operator <( const ff & a )const{
return d > a.d;
}
};
int cnt;
double cost[MAXN][MAXN];
double dis[MAXN];
double gdis( int pre, int pos ){
double dx = node[pre].x - node[pos].x;
double dy = node[pre].y - node[pos].y;
return sqrt( dx * dx + dy * dy );
}
void dij(){
for( int i = 1; i < MAXN; i++ )
dis[i] = INF;
dis[1] = 0;
priority_queue<ff> Q;
Q.push( ff( 1, dis[1]) );
while( !Q.empty() ){
ff temp = Q.top(); Q.pop();
int x = temp.x;
if( temp.d > dis[x] ) continue;
for( int i = 1; i < cnt; i++ ){
if( dis[i] > dis[x] + cost[x][i] ){
dis[i] = dis[x] + cost[x][i];
Q.push( ff( i, dis[i] ) );
}
}
}
}
int main(){
ios::sync_with_stdio( false );
for( int i = 0; i < MAXN; i++ )
for( int j = 0; j < MAXN; j++ )
cost[i][j] = INF;
cin >> node[1].x >> node[1].y >> node[2].x >> node[2].y;
cnt = 3;
while( cin >> node[cnt].x >> node[cnt].y ){
cnt++;
while( cin >> node[cnt].x >> node[cnt].y, !( node[cnt].x == -1 && node[cnt].y == -1 ) ){
cost[cnt][cnt - 1] = cost[cnt - 1][cnt] = gdis( cnt - 1, cnt ) / ssp;
cnt++;
}
}
for( int i = 1; i < cnt - 1; i++ ){
cost[i][i] = 0;
for( int j = i + 1; j < cnt; j++ ){
cost[i][j] = cost[j][i] = min( cost[i][j], gdis( i, j ) / wsp );
}
}
dij();
cout << int( dis[2] + 0.5 );
return 0;
}
L - Subway(最短路spfa)的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 【wikioi】1269 匈牙利游戏(次短路+spfa)
http://www.wikioi.com/problem/1269/ 噗,想不到.. 次短路就是在松弛的时候做下手脚. 设d1为最短路,d2为次短路 有 d1[v]>d1[u]+w(u, v) ...
- 次短路[SPFA]
Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...
- HDU1874 最短路 SPFA
最短路 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 24 Solved: 17 [Submit][Status][Web Board] Descr ...
- (poj 2502) Subway 最短路
题目链接: 题意:在一个城市里有许多地铁,现在你知道每条地铁的起点 终点与停站点的坐标,知道我们的起始坐标与终点坐标,问加上走路最快到达终点的时间是多少? 方法:求出任意两点的车速时间与步行时间,再 ...
- 30-算法训练 最短路 spfa
http://lx.lanqiao.cn/problem.page?gpid=T15 算法训练 最短路 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个n个顶点, ...
- 有限制的最短路spfa+优先队列
poj1724 ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10751 Accepted: 3952 De ...
- 蓝桥杯 最短路 spfa
问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...
- hdu 2962 Trucking (二分+最短路Spfa)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others ...
随机推荐
- Ubuntu16.04下安装nvidia-docker2
若docker-ce.nvidia.CUDA等都安装完成之后,开启docker服务时,能够正常运行,并有预测结果,那表示服务开启没问题:若都安装成功之后,用docker命令开启服务时,一直报错,可能表 ...
- Yuchuan_Linux_C编程之九目录操作相关函数
一.整体大纲 二.相关函数 1. getcwd 函数作用:获取当前目录 头文件 #include <unistd.h> 函数原型 char *getcwd(char *buf, size_ ...
- Excel 电子表格中,快速修改表格中的数值
打开设置单元格设置选项后,当前界面,分类下面的选项中,选择“自定义”,并在右侧展示的“类型(T)”下方的对话框中,输入以下代码: [=1]√;[=2]×; 并按确认, [=1] 意思为: 将单元格中, ...
- httpServletRequest.getCharacterEncoding()取出来是个null,怎么办?
因为浏览器没有把正确的编码方式给服务器端. 目前,许多浏览器在Content-Type头中不会指定字符编码方式,那么容器就会使用"ISO-8859-1"方式解析POST数据,而此时 ...
- JAVA-迭代器\增强型for循环。(新手)
//导入的包.import java.lang.reflect.Array;import java.util.*;//创建的一个类.public class zylx1 { //公共静态的主方法. p ...
- sql 语句系列(多表之链)[八百章之第三章]
新增连接查询而不影响其他连接查询 请看图: 这种情况我们一般会使用左连接的方式. select e.ENAME,d.LOC,eb.RECEIVED from emp e join dept d on( ...
- java之AQS和显式锁
本次内容主要介绍AQS.AQS的设计及使用.ReentrantLock.ReentrantReadWriteLock以及手写一个可重入独占锁 1.什么是AQS? AQS,队列同步器AbstractQu ...
- mvc5+ET6入门第一章
这一篇主要讲的是MVC也就是Model--View--Controller的缩写,没有讲ET.其中 Model(模型)表示应用程序核心(比如数据库记录列表).通常模型对象在数据库中存取数据. View ...
- python对目录下的文件进行 多条件排序
在进入正题之前,先介绍一下基础知识: 1.sort(),方法:就是对列表内容进行正向排序,直接在原列表进行修改,返回的是修改后的列表 lists =[1, 5, 10, 8, 6]lists.sort ...
- Prism 源码解读1-Bootstrapper和Region的创建
介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...