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 ...
随机推荐
- 谈谈集合.Queue
之前说到,Java中集合的主要作用就是装盛其他数据和实现常见的数据结构.所以当我们要用到"栈"."队列"."链表"和"数组&quo ...
- git删除远程仓库中的文件夹
具体操作如下: git rm -r --cached .history #删除目录 git commit -m”删除.history文件夹” git push -r表示递归所有子目录,如果你要删 ...
- XCTF---easyjava的WriteUp
一.题目来源 题目来源:XCTF题库安卓区easyjava 题目下载链接:下载地址 二.解题过程 1.将该apk安装进夜神模拟器中,发现有一个输入框和一个按钮,随便输入信息,点 ...
- 05 JPAUtil工具类
public final class JPAUtil { // JPA的实体管理器工厂:相当于Hibernate的SessionFactory private static EntityManager ...
- 7种你应该知道的JavaScript常见的错误
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/types-of-native-errors-in- ...
- TCP报文首部
源端口和目的端口,各占2个字节,每个TCP报文段都包含源端口号和目的端口号,用于寻找发送端和接收端的应用进程: 序号,占4个字节,序号用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个 ...
- Simulink仿真入门到精通(十八) TLC语言
TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...
- 谈谈SQL优化
写SQL是学习数据库必须掌握的非常重要的技能之一.在学习过程当中,我们会尝试写各种各样满足需求的SQL语句.在实际项目中,优秀的SQL语句和普通的SQL语句的执行速度差别非常大.对于一个数据量很大的系 ...
- JavaScript每日学习日记(2)
8.13.2019 1. 正则表达式常见字符串方法: search( ) , replace( ) var str = "Visit Website"; var n = str.s ...
- Jenkins+Ant+JMeter集成
Tomcat是jenkins运行的容器,jenkins实际上是依赖于Tomcat才能启动的.Jenkins可以调度ant的脚本. Ant和maven类似,maven是执行pom文件,ant是执行bui ...