#include <bits/stdc++.h>
using namespace std;
int n, m ,s;
const int maxn = 2e5+1;
const int INF = 2147483647;
int head[maxn << 1];
int cnt = 0;
struct edge
{
int u, v, w, nxt;
}edge[maxn];
long long d[maxn];
bool done[maxn];
struct node{
int id, dis;
node(int a, int b) {
id = a; dis = b;
}
bool operator < (const node &a) const {
return dis > a.dis;
}
};
void addedge(int a, int b ,int c) {
edge[cnt].u = a;
edge[cnt].v = b;
edge[cnt].w = c;
edge[cnt].nxt = head[a];
head[a] = cnt++;
}
void init() {
for(int i = 0; i < m; i++){
edge[i].nxt = -1;
}
for(int i = 0; i < n; i++)
head[i] = -1;
}
void dijk(int s) {
for(int i = 0; i< n; i++) {d[i] = INF; done[i] = 0;}
d[s] = 0;
priority_queue <node> g;
g.push(node(s, 0));
while(!g.empty()) {
node u = g.top();
g.pop();
if(done[u.id])continue;
done[u.id] = 1;
for(int i = head[u.id]; ~i; i = edge[i].nxt) {
int x= edge[i].v;
if(done[x]) continue;
if(d[x] > u.dis + edge[i].w) {
d[x] = u.dis + edge[i].w;
g.push(node(x, d[x]));
}
}
}
}
int main() {
//freopen("a.in", "r", stdin);
//freopen("a.out", "w", stdout);
init();
scanf("%d%d%d", &n, &m, &s);
for(int i = 0; i< m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
addedge(a, b, c);
}
dijk(s);
for(int i = 1; i< n; i++)
printf("%lld ", d[i]);
return 0;
}
求解释