1 #include <iostream> //[模版]单源最短路 dijkstra&SPFA(小根堆+pair优化)
2 #include <cstdio>
3 #include <algorithm>
4 #include <queue>
5 #include <cstring>
6 #include <vector>
7 const int maxn=1000010;
8 typedef std::pair <long long ,int > p;
9 std::priority_queue < p , std::vector <p> , std::greater <p> > q;
10 using namespace std;
11 long long k=0,head[maxn],dis[maxn]={2147483647};
12 bool vis[maxn];
13 int n,m,s;
14
15 struct edge
16 {int next,to,val;}e[maxn*2];
17
18 inline void add(int from,int to,int val)
19 {
20 e[++k].to=to;
21 e[k].val=val;
22 e[k].next=head[from];
23 head[from]=k;
24 }
25
26 inline void dijkstra(int s)
27 {
28 q.push( make_pair (0,s) ) , dis[s]=0;
29 while(!q.empty())
30 {
31 int from = q.top().second;
32 long long distance=q.top().first;
33 q.pop();
34 vis[from] = true;
35 if(distance>dis[from])continue;
36 for(int i=head[from];i;i=e[i].next)
37 {
38 int to = e[i].to;
39 if(!vis[to] && dis[to] > dis[from] + e[i].val)
40 {
41 dis[to] = dis[from]+e[i].val;
42 q.push( make_pair (dis[to],to) );
43 }
44 }
45 }
46 }
47
48 inline void spfa(int s)//披着Dijkstra外衣的SPFA
49 {
50 dis[s]=0 , q.push(make_pair(dis[s],s));
51 while(!q.empty()){
52 int now=q.top().second;
53 q.pop();
54 if(vis[now])continue;
55 vis[now]=1;
56 for(int i=head[now];i;i=e[i].next)
57 {
58 int to=e[i].to;
59 if(!vis[to]&&dis[now]+e[i].val<dis[to])
60 {
61 dis[to]=dis[now]+e[i].val;
62 q.push(make_pair(dis[to],to));
63 }
64 }
65 }
66 }
67
68
69 int main ()
70 {
71 cin>>n>>m>>s;
72 for (int i=1;i<=m;i++)
73 {
74 int u,v,w;
75 scanf ("%d%d%d",&u,&v,&w);
76 add(u,v,w);
77 }
78 memset(dis,0x3f,sizeof(dis));
79 memset(vis,0,sizeof(vis));
80 spfa(s);
81 //dijkstra(s);
82 for (int i=1;i<=n;i++)
83 {
84 printf ("%lld ",dis[i]);
85 }
86 return 0;
87 }