#include <bits/stdc++.h>
#define INF 0x3f3f3f
using namespace std;
struct Edge {
int to, value, next;
Edge(int _to = 0, int _value = INF, int _next = 0): to(_to), value(_value), next(_next) {}
} e[200005];
struct Point {
int num, dist;
Point(int _num = 0, int _dist = 0): num(_num), dist(_dist) {}
};
bool operator < (const Point &a, const Point &b) {
return a.dist > b.dist;
}
priority_queue<Point> q;
int n, m, s;
int dis[100005], vis[100005], head[100005], cnt;
void add(int u, int v, int w) {
e[++cnt].to = v;
e[cnt].value = w;
e[cnt].next = head[u];
head[u] = cnt;
}
void Dijkstra(int start) {
Point p;
for (int i = 1; i <= n; i++) dis[i] = INF;
dis[start] = 0;
p.num = start;
p.dist = 0;
q.push(p);
while (!q.empty()) {
int cur = q.top().num;
q.pop();
if (vis[cur]) continue;
vis[cur] = 1;
for (int i = head[cur]; i != -1; i = e[i].next) {
int to = e[i].to;
if (dis[to] > e[i].value + dis[cur] && !vis[to]) {
dis[to] = e[i].value + dis[cur];
p.num = to;
p.dist = dis[to];
q.push(p);
}
}
}
}
int main() {
cin >> n >> m >> s;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
}
Dijkstra(s);
for (int i = 1; i <= n; i++) cout << dis[i] << ' ';
return 0;
}
死循环了。。。