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)的更多相关文章

  1. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  2. 【wikioi】1269 匈牙利游戏(次短路+spfa)

    http://www.wikioi.com/problem/1269/ 噗,想不到.. 次短路就是在松弛的时候做下手脚. 设d1为最短路,d2为次短路 有 d1[v]>d1[u]+w(u, v) ...

  3. 次短路[SPFA]

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  4. HDU1874 最短路 SPFA

    最短路 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 24  Solved: 17 [Submit][Status][Web Board] Descr ...

  5. (poj 2502) Subway 最短路

    题目链接: 题意:在一个城市里有许多地铁,现在你知道每条地铁的起点  终点与停站点的坐标,知道我们的起始坐标与终点坐标,问加上走路最快到达终点的时间是多少? 方法:求出任意两点的车速时间与步行时间,再 ...

  6. 30-算法训练 最短路 spfa

    http://lx.lanqiao.cn/problem.page?gpid=T15 算法训练 最短路   时间限制:1.0s   内存限制:256.0MB        问题描述 给定一个n个顶点, ...

  7. 有限制的最短路spfa+优先队列

    poj1724 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10751   Accepted: 3952 De ...

  8. 蓝桥杯 最短路 spfa

    问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...

  9. hdu 2962 Trucking (二分+最短路Spfa)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others ...

随机推荐

  1. Keras在MNIST实现LeNet-5模型训练时的错误?

    当使用Keras API 训练模型时,训练时报错? UnknownError (see above for traceback): Failed to get convolution algorith ...

  2. SpringBoot1.5.10.RELEASE项目如何在tomcat容器中运行

    一. SpringBoot内嵌容器的部署方式 SpringBoot内部默认提供内嵌的tomcat容器,所以可以直接打成jar包,丢到服务器上的任何一个目录,然后在当前目录下执行java -jar de ...

  3. getBoundingClientRect的实用场景

    在用vue开发项目时候,遇到一个问题,首页有代办列表,是固定定位,滚动时候需要监听距离页面顶部的距离,如果很接近顶部则将代办列表展示,首页隐藏,如果再网上翻动则又回到首页. 因为是是fixed定位,所 ...

  4. 登录页面判断session退出登录清空session

    1 2 3 4 5 6 if(empty($_POST)){      $_SESSION = array();     if(isset($_COOKIE[session_name()])){    ...

  5. layui表格数据渲染SpringBoot+Thymeleaf返回的数据时报错(Caused by: org.attoparser.ParseException: Could not parse as expression: ")

    layui table渲染数据时报错(Caused by: org.attoparser.ParseException: Could not parse as expression: ") ...

  6. flask 部署外部访问

    在 app.run(host='0.0.0.0',port=5000) 可以让外部客户端进行访问,访问地址是flask服务器的ip地址和你设置的端口(端口注意不要占用其他端口,如果是阿里云有可能要设置 ...

  7. Ansible-1 基本认识及清单与模块

    ansible 一.常用的自动化运维工具 1.puppet 基于ruby开发,采用c/s架构,扩展性强,基于ssl,远程命令执行相对较弱, 2.saltstack 基于python开发,采用C/S架构 ...

  8. [日志分析]Graylog2采集Nginx日志 被动方式

    graylog可以通过两种方式采集nginx日志,一种是通过Graylog Collector Sidecar进行采集(主动方式),另外是通过修改nginx配置文件的方式进行收集(被动方式). 这次说 ...

  9. 第3章 C++中的C

    用union节省内存 使用场合:有时一个程序会使用同一个变量处理不同的数据类型,对于这种情况,有两种选择:可以创建一个struct,其中包含所有可能的不同类型的数据:也可以使用联合union,它能把所 ...

  10. 原生Canvas循环滚动弹幕(现金红包活动带头像弹幕)

    效果 gif有些糊,可以 在线预览 实现关键点 requestAnimationFrame 循环帧: 绘制单条弹幕,画框子 -> 画头像 -> 写黑色的字 -> 写红色的字, mea ...