题意 : 给出二维平面上的两个点代表起点以及终点,接下来给出若干条地铁线路,除了在地铁线路上行进的速度为 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 ( 最短路 && 最短路建图 )的更多相关文章

  1. 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 ...

  2. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  3. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

  4. HDU5669 Road 分层最短路+线段树建图

    分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ​的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...

  5. Dijkstra+计算几何 POJ 2502 Subway

    题目传送门 题意:列车上行驶40, 其余走路速度10.问从家到学校的最短时间 分析:关键是建图:相邻站点的速度是40,否则都可以走路10的速度.读入数据也很变态. #include <cstdi ...

  6. poj 2502 Subway【Dijkstra】

    <题目链接> 题目大意: 某学生从家到学校之间有N(<200)条地铁,这个学生可以在任意站点上下车,无论何时都能赶上地铁,可以从一条地铁的任意一站到另一条地跌的任意一站,学生步行速度 ...

  7. 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)

    Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...

  8. POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)

    题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...

  9. POJ 2226 Muddy Fields 二分图(难点在于建图)

    题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...

随机推荐

  1. SpringBoot系列:三、SpringBoot中使用Filter

    在springboot中要使用Filter首先要实现Filter接口,添加@WebFilter注解 然后重写三个方法,下图示例是在Filter中过滤上一届中拿配置的接口,如果是这个接口会自动跳转到/P ...

  2. Python3之异常处理

    写自动化脚本时经常会用到异常处理,下面将python中的异常处理做一整理: 注意:以下所有事列中的111.txt文件不存在,所以会引起异常 用法一:try...except...else..类型 1. ...

  3. final关键字的案例

    package com.company.java.oop.cls; class ClassF { // static ClassF instance =new ClassF(); static { S ...

  4. JQuery weui 中的Popup (弹出层:底部)

    //弹出层(从底部) <div id="bottomb" class="weui-popup__container popup-bottom"> & ...

  5. Spring MVC配置文件

    都说开发Spring Web程序的配置文件很繁琐,所以就写了一篇配置博客, 首先是pom.xml文件 <project xmlns="http://maven.apache.org/P ...

  6. 常用js方法封装使用

    // 冒泡排序 export function bubbleSort(arr) { let i = arr.length - 1; while (i > 0) { let maxIndex = ...

  7. lesson1-图的概念和图论模型

    说明: 图论专题开设的目的主要是作为本学期复习巩固和分享自己对于图论的理解,主要参考的是老师的PPT.应老师要求,不能共享文件,抱歉! 参考书目:[1] J.A. Bondy,  U.S.R. Mur ...

  8. [2019杭电多校第四场][hdu6614]AND Minimum Spanning Tree(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6614 题目大意是有一张n个点的完全图,n个点点权为1-n,边权为两点点权按位与(&).求最小生 ...

  9. (转载)图解Java多态内存分配以及多态中成员方法的特点

    图解Java多态内存分配以及多态中成员方法的特点   图解Java多态内存分配以及多态中成员方法的特点   Person worker = new Worker(); 子类实例对象地址赋值给父类类型引 ...

  10. 生产者消费者模型(JoinableQueue)