// // dijkstra妯℃澘.cpp // algorithm // // Created by david.xu on 2018/8/6. // Copyright 漏 2018骞?david.xu. All rights reserved. //当一个点入队超过n次则存在负环BFS //快:DFS当一个点在最短路中出现两次 #include <stdio.h> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <vector> #define maxn 100010 using namespace std; int n,m,s,dis[maxn]; bool vis[maxn]; struct edge{ int val,to; }; vector<edge> e[maxn]; queue<int> q; void SPFA() { for(int i=1;i<=n;i++) dis[i]=1000000001; dis[s]=0; q.push(s); vis[s]=1; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=0;i<e[x].size();i++) { int y=e[x][i].to; if(dis[x]+e[x][i].val<dis[y]) { dis[y]=dis[x]+e[x][i].val; if(!vis[y]) { q.push(y); vis[y]=1; } } } vis[x]=0; } } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); edge tmp; tmp.to=y; tmp.val=z; e[x].push_back(tmp); } SPFA(); for(int i=1;i<=n;i++) printf("%d ",dis[i]); return 0; }