• 洛谷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]);
    }
    
    
  • 相关阅读:
    飞腾1500A 上面银河麒麟操作系统 进行远程以及添加用户的方法 linux xrdp
    centos7 安装Anaconda3及使用
    机器学习(ML)中文视频教程
    spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
    Cocos2d-X中使用ProgressTimer实现一些简单的效果
    总结几点关于做互联网产品的思路
    norflash和nandflash电路
    存储过程
    USACO hamming 继续暴搜
    [原理分析]Linux下的栈溢出案例分析-GDB调试操练[1]
  • 原文地址:https://www.cnblogs.com/mmmqqdd/p/10847047.html
Copyright © 2020-2023  润新知