首页 > 其他 > 详细

洛谷P4779 【模板】单源最短路径

时间:2019-05-10 23:19:50      阅读:153      评论:0      收藏:0      [点我收藏+]

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]);
}

洛谷P4779 【模板】单源最短路径

原文:https://www.cnblogs.com/mmmqqdd/p/10847047.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!