LibreOJ #119. 最短路

二次联通门 : LibreOJ #119. 最短路

/*
    LibreOJ #119. 最短路 

    堆优化的Dijkstra

*/
#include <cstring>
#include <cstdio>
#include <queue>

#define Max 6000

void read (int &now)
{
    now = 0;
    register char word = getchar ();
    while (word < ‘0‘ || word > ‘9‘)
        word = getchar ();
    while (word >= ‘0‘ && word <= ‘9‘)
    {
        now = now * 10 + word - ‘0‘;
        word = getchar ();
    }
}

struct Data
{
    int Id;
    int dis;

    bool operator < (const Data &now) const
    {
        return this->dis > now.dis;
    }

    Data (int __Id, int __dis) : Id (__Id), dis (__dis) {};

    Data () {};
};

class Dijkstra_Type
{

    private :

        int __to[Max << 3], __next[Max << 3];
        int __dis[Max << 3];

        int Edge_Count;
        int edge_list[Max];
        bool visit[Max];

        int dis[Max];

    public :

        void Insert_edge (int from, int to, int dis)
        {
            Edge_Count ++;

            __to[Edge_Count] = to;
            __next[Edge_Count] = edge_list[from];
            edge_list[from] = Edge_Count;

            Edge_Count ++;

            __to[Edge_Count] = from;
            __next[Edge_Count] = edge_list[to];
            edge_list[to] = Edge_Count;

            __dis[Edge_Count] = __dis[Edge_Count - 1] = dis;
        }

        int Dijkstra (int Start, int End)
        {
            std :: priority_queue <Data> Queue;

            memset (dis, 0x3f, sizeof dis);

            Data now ;

            for (Queue.push (Data (Start, 0)), dis[Start] = 0; !Queue.empty (); Queue.pop ())
            {
                now = Queue.top ();

                if (visit[now.Id])
                    continue;

                visit[now.Id] = true;

                for (int i = edge_list[now.Id]; i; i = __next[i])

                    if (dis[__to[i]] > dis[now.Id] + __dis[i])
                    {
                        dis[__to[i]] = dis[now.Id] + __dis[i];
                        Queue.push (Data (__to[i], dis[__to[i]]));
                    }
            }
            return dis[End];
        }
};

Dijkstra_Type Make;

int main (int argc, char *argv[])
{
    int N, M;
    int x, y, z;

    int S, T;
    for (read (N), read (M), read (S), read (T); M --; )
    {
        read (x);
        read (y);
        read (z);

        Make.Insert_edge (x, y, z);
    }

    printf ("%d", Make.Dijkstra (S, T));

    return 0;
}
时间: 2024-11-03 21:46:35

LibreOJ #119. 最短路的相关文章

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是

Travel(最短路)

Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n1,2,…,n. Among n(n−1)2n(n−1)2 pairs of towns, mm of them are connected by bidirectional highway, which needs aa minutes to travel. The other pairs are connected b

(最短路)2017 计蒜之道 复赛 D. 百度地图导航

百度地图上有 nn 个城市,城市编号依次为 11 到 nn.地图中有若干个城市群,编号依次为 11 到 mm.每个城市群包含一个或多个城市:每个城市可能属于多个城市群,也可能不属于任何城市群. 地图中有两类道路.第一类道路是 城市之间的快速路,两个城市 u,vu,v 之间增加一条距离为 cc 的边:第二类道路是 城市群之间的高速路,连接两个城市群 a,ba,b,通过这条高速路,城市群 aa 里的每个城市与城市群 bb 里的每个城市之间两两增加一条距离为 cc 的边.图中所有边均为无向边. 你需要

ZOJ 3668 Launching the Spacecraft (差分约束系统,最短路)

题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3668 题意: 给一个初始值为0的长度为n的区间,给m个约束l,r,a,b,表示从l到r的区间和>=a且<=b,且每个数的范围为-10000~10000,问这个区间的每个数是多少,要求数尽可能大,且序列字典序最大. 方法: 差分约束系统,以前缀和表示一个节点a[i] 建图:根据下面约束条件建图 a[i]-a[i-1]<=10000 a[i-1]-a[i]&l

HDU 5889 Barricade(最短路+最小割)

http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障碍,每条边上都有一个放置障碍的代价.求至少需要多少代价. 思路: 首先就是求最短路,然后将最短路上的边重新进行构图跑最小割即可. 一开始求了两遍bfs,分别求出起点到各个点的距离和终点到各个点的距离,然后去判断每条边是否在最短路中,但是这样的话在最大流的构图中无法确定方向,然后就一直Wa... 其实

Codeforces 716D - Complete The Graph(最短路)

题意:给定n个点,m条边,以及起点s,终点t,问你图中是否存在s->t的最短路为L,其中权值为0的可以任意修改. 思路:对给定的边分为2类,权重不为0的直接扔进去建图,权重为0的边先存起来.接着跑一遍堆优化的dij,如果dis[t]小于L,那么无论怎么修改权重0的边都没有办法凑出最短路L: 如果dis[t]=L,那么直接输出:如果dis[t]>L,则将原来事先存起来的边一条一条的加进去,权值设为1.每加一条边就跑一次dij,一旦找到dis[t]<=L,就可以终止并输出. PS:原来堆优化

二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 10.28 9 9 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ##E # ######### 4.67 9 9 ######### # ## ## ### #S# # # # E ## # # ##### # ## ### # ##### # # # # ######### 39.06 9 9 ######### # # # # # # # #

HDU 5889 (最短路+网络流)

Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 340 Problem Description The empire is under attack again. The general of empire is planning to defend hi

[CSUOJ1808] 地铁(dijkstra,堆,边最短路)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题意:题面挺清楚啦,就是求一个最短路.只不过每个点之间的边有可能是不同线路的,要从一个线路换到另一个线路是需要花费时间的. 边有特殊的定义,那么就不以点为分析对象做最短路了.直接拿边,dis(i)表示从1到达第i条边的指向点为终点的最短距离,每次松弛找到的边的目的点是t的时候更新一下结果. 1 #include <algorithm> 2 #include <iostre