POJ 2502 Subway ( 最短路 && 最短路建图 )
题意 : 给出二维平面上的两个点代表起点以及终点,接下来给出若干条地铁线路,除了在地铁线路上行进的速度为 40km/h 其余的点到点间都只能用过步行且其速度为 10km/h ,现问你从起点到终点的最短路是多少?
分析 : 这题建完图之后就是裸的最短路了,在建图的时候需要注意地铁的站点之间不能隔点建拥有地铁行进速度的边,也就是若地铁线路为 A->B->C 那么则不能建 A->C 这条速度为 40km/h 的边,因为地铁是在节点间行进的,如果要跨站点那么只能通过步行。图中边的权值为 (两点间距 / 速度 ),其中速度需要将 km/h 转化为 m/min。
#include<bits/stdc++.h> #include<ext/pb_ds/priority_queue.hpp> using namespace std; using namespace __gnu_pbds; typedef pair< double, int > pii; + ; const double INF = 1e30; struct POINT{ int x, y; }; struct EDGE{ int v, nxt; double w; }; double v1, v2; int Head[maxn], cnt, PointCnt; double Dis[maxn]; EDGE Edge[maxn * maxn + maxn]; POINT Point[maxn]; inline void init() { ; i<=PointCnt; i++) Head[i] = -; cnt = ; PointCnt = ; } double GetDis(int from, int to) { double x1 = (double)Point[from].x, y1 = (double)Point[from].y; double x2 = (double)Point[to].x, y2 = (double)Point[to].y; return sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ); } inline void AddEdge(int from, int to, bool flag) { double Weight; if(flag) Weight = GetDis(from, to) / v1; else Weight = GetDis(from, to) / v2; Edge[cnt].v = to; Edge[cnt].w = Weight; Edge[cnt].nxt = Head[from]; Head[from] = cnt++; } double Dijkstra() { ; i<=PointCnt; i++) Dis[i] = INF; __gnu_pbds::priority_queue<pii,greater<pii>,pairing_heap_tag > Heap; Dis[] = 0.0; Heap.push(make_pair()); while(!Heap.empty()){ pii T = Heap.top(); Heap.pop(); if(Dis[T.second] != T.first) continue; ; i=Edge[i].nxt){ int Eiv = Edge[i].v; if(Dis[Eiv] > Dis[T.second] + Edge[i].w){ Dis[Eiv] = Dis[T.second] + Edge[i].w; Heap.push(make_pair(Dis[Eiv], Eiv)); } } } ]; } int main(void) { v1 = 40000.0/60.0; v2 = 10000.0/60.0; PointCnt = maxn - ; ].x, &Point[].y)){ scanf(].x, &Point[].y); init(); int x, y; while(scanf("%d %d", &x, &y)!=EOF){ PointCnt++; Point[PointCnt].x = x; Point[PointCnt].y = y; int pre = PointCnt; && y==-)){ PointCnt++; int now = PointCnt; Point[PointCnt].x = x; Point[PointCnt].y = y; AddEdge(pre, now, true); AddEdge(now, pre, true); pre = now; } } ; i<=PointCnt; i++){ for(int j=i; j<=PointCnt; j++){ if(j != i){ AddEdge(i, j, false); AddEdge(j, i, false); } } } printf("%.0lf\n", Dijkstra()); } ; }
POJ 2502 Subway ( 最短路 && 最短路建图 )的更多相关文章
- POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)
POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- POJ 2502 Subway (Dijkstra 最短+建设规划)
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6689 Accepted: 2176 Descriptio ...
- HDU5669 Road 分层最短路+线段树建图
分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) 的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...
- Dijkstra+计算几何 POJ 2502 Subway
题目传送门 题意:列车上行驶40, 其余走路速度10.问从家到学校的最短时间 分析:关键是建图:相邻站点的速度是40,否则都可以走路10的速度.读入数据也很变态. #include <cstdi ...
- poj 2502 Subway【Dijkstra】
<题目链接> 题目大意: 某学生从家到学校之间有N(<200)条地铁,这个学生可以在任意站点上下车,无论何时都能赶上地铁,可以从一条地铁的任意一站到另一条地跌的任意一站,学生步行速度 ...
- 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)
Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...
- POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)
题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...
- POJ 2226 Muddy Fields 二分图(难点在于建图)
题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...
随机推荐
- Delphi XE2 之 FireMonkey 入门(23) - 数据绑定: TBindingsList: TBindExpression
准备用 TBindingsList 重做上一个例子. 可以先把 TBindingsList 理解为是一组绑定表达式(TBindExpression)的集合;官方应该是提倡在设计时完成 TBindExp ...
- tensorflow和keras的安装
1 卸载tensorflow方法,在终端输入: 把protobuf删除了才能卸载干净. sudo pip uninstall protobuf sudo pip uninstall tensorfl ...
- maximize_window()最大化浏览器和刷新当前页面refresh()
from selenium import webdriverdriver = webdriver.Firefox()driver.get("https://www.baidu.com&quo ...
- 阅读jdk源码的流程(从今天开始要阅读jdk源码)
1.java.lang 2.java.util 3.java.util.concurrent 4.java.util.concurrent.atomic 5.java.lang.reflect 6.j ...
- python 入门学习之anaconda篇
还没下载的同学先点击这里进入anaconda官方网站进行下载. 然后点击安装,注意的是这里 安装好了之后呢,我们就开始进行Conda的环境管理,Conda的环境管理功能允许我们同时安装 若干不同版本的 ...
- python+selenium元素定位之CSS学习01
参考文档:https://www.w3school.com.cn/cssref/css_selectors.asp 选择器 例子 例子描述 CSS .class .intro 选择 class=&qu ...
- python2.7打印中文乱码的问题解决
一. import sys reload(sys) sys.setdefaultencoding('utf-8') print('测试中文') 二. print(‘我是中国人’) >>&g ...
- 编码规范(code style guide)
1. Javascript Google: https://google.github.io/styleguide/jsguide.html Airbnb:https://github.com/air ...
- Angular 组件通讯方式
(一)父子组件 输入/输出属性 关键词 Input,Output,EventEmitter. 父子组件信息信息,分为 (1)子组件向父组件传递 (2)父组件向子组件传递 (二)模版变量与 @V ...
- 所有的数据处理都是map-reduce
用reduce求和 const sum = [1,2,3,4,5,6].reduce((v,t)=>{ return v+t; //第一次v=0,t=1 //第二次v= 0+1,t=2 //第三 ...