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