dj

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#define P pair<int,int>
#define mp(a,b) make_pair(a,b)
using namespace std;
const int maxn=500100;
int first[maxn],to[maxn],next[maxn],cnt,val[maxn];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
    return x*f;
}
void add(int u,int v,int w)
{
    to[++cnt]=v;
    next[cnt]=first[u];
    first[u]=cnt;
    val[cnt]=w;
}
int n,m,S;
int dis[maxn];
void dijkstra(int s)
{
    priority_queue<P,vector<P>,greater<P> > q;
    for(int i=1;i<=n;i++)dis[i]=2147483647;
    q.push(mp(0,s));
    dis[s]=0;
    while(!q.empty())
    {
        int now=q.top().second;
        q.pop();
        for(int i=first[now];i;i=next[i])
        {
            if(dis[to[i]]>dis[now]+val[i])
            {
                dis[to[i]]=dis[now]+val[i];
                q.push(mp(dis[to[i]],to[i]));
            }
        }
    }
}
int main()
{
    n=read(),m=read(),S=read();
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        u=read(),v=read(),w=read();
        add(u,v,w);
    }
    dijkstra(S);
    for(int i=1;i<=n;i++)printf("%d ",dis[i]);
}

 

posted @ 2017-10-30 20:26  探险家Mr.H  阅读(145)  评论(0编辑  收藏  举报