zoukankan      html  css  js  c++  java
  • 洛谷P4779 【模板】单源最短路径

    P4779 【模板】单源最短路径(标准版)

    题目链接

    https://www.luogu.org/problemnew/show/P4779

    题目描述

    给定一个 N个点,M条有向边的带非负权图,请你计算从 S出发,到每个点的距离。

    数据保证你能从 S 出发到任意点。

    输入输出格式

    输入格式:

    第一行为三个正整数 N,M,S。 第二行起 M行,每行三个非负整数 (u_i, v_i, w_i)表示从 (u_i)(v_i)有一条权值为 (w_i)的边。

    输出格式:

    输出一行 N个空格分隔的非负整数,表示 S 到每个点的距离。

    输入输出样例

    输入样例#1:

    复制

    4 6 1
    1 2 2
    2 3 2
    2 4 1
    1 3 5
    3 4 3
    1 4 4
    

    输出样例#1:

    复制

    0 2 4 3
    

    说明

    (large1≤N≤100000)

    (large1≤M≤200000)

    (large S=1)

    (large1≤ui,vi≤N)

    $large0≤wi≤10^9 $

    (large0≤sum w_i leq 10 ^ 9)

    题解

    最短路模板题,好久没做图啦,最近一直在做路,竟然存了双向边。。。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define N 100050
    #define M 200050
    int n,m,dis[N];
    int tot,last[N];
    struct Edge{int from,to,val,s;}edges[M];
    template<typename T>void read(T&x)
    {
        ll k=0; char c=getchar();
        x=0;
        while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
        if (c==EOF)exit(0);
        while(isdigit(c))x=x*10+c-'0',c=getchar();
        x=k?-x:x;
    }
    void read_char(char &c)
    {while(!isalpha(c=getchar())&&c!=EOF);}
    void AddEdge(int x,int y,int z)
    {
        edges[++tot]=Edge{x,y,z,last[x]};
        last[x]=tot;
    }
    void dijkstra(int qd)
    {
        struct HeapNode
        {
            int id,val;
            bool operator <(const HeapNode&b)const 
                {return val>b.val;}
        };
        priority_queue<HeapNode>Q;
        memset(dis,127,sizeof(dis));
        dis[qd]=0;
        Q.push(HeapNode{qd,0});
        while(!Q.empty())
        {
            int u=Q.top().id,d=Q.top().val;
            Q.pop();
            if (d!=dis[u])continue;
            for(int i=last[u];i;i=edges[i].s)
            {
                Edge &e=edges[i];
                if (dis[e.to]-dis[u]>e.val)
                {
                    dis[e.to]=dis[u]+e.val;
                    Q.push(HeapNode{e.to,dis[e.to]});
                }
            }
        }
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("aa.in","r",stdin);
    #endif
        int qd;
        read(n); read(m); read(qd);
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            read(x); read(y); read(z);
            AddEdge(x,y,z);
        }
        dijkstra(qd);
        for(int i=1;i<=n;i++)printf("%d ",dis[i]);
    }
    
    
  • 相关阅读:
    Java Native Method
    SQL语句优化
    Ibatis的环境搭建以及遇到的问题解决
    Java 构建器
    SpringMVC自定义视图 Excel视图和PDF视图
    java 枚举的常见使用方法
    mysql 根据某些字段之和排序
    MFC The Screen Flickers When The Image Zoomed
    How To Debug Qmake Pro File
    Gcc And MakeFile Level1
  • 原文地址:https://www.cnblogs.com/mmmqqdd/p/10847047.html
Copyright © 2011-2022 走看看