#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define Pii pair<int, int>
namespace gdb7
{
struct Edge {
int w, to, nxt;
} edges[500010];
int head[100010], eid, dis[100010], vis[100010], n, m, s;
inline void insert(int u, int v, int w) {
edges[++eid].w = w;
edges[eid].to = v;
edges[eid].nxt = head[u];
head[u] = eid;
}
struct Node {
int w, u;
inline const bool operator<(const Node &rhs) const {
return w < rhs.w;
}
};
priority_queue<Node> pq;
void dijkstra(int s) {
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; ++i) {
dis[i] = 2147483647;
}
dis[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
Node tmp = pq.top();
vis[tmp.u] = 1;
pq.pop();
for (int i(head[tmp.u]); ~i; i = edges[i].nxt) {
if (dis[edges[i].to] > dis[tmp.u] + edges[i].w) {
dis[edges[i].to] = dis[tmp.u] + edges[i].w;
pq.push({tmp.w + edges[i].w, edges[i].to});
}
}
}
}
int main() {
memset(head, -1, sizeof(head));
scanf("%d%d%d", &n, &m, &s);
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
insert(u, v, w);
}
dijkstra(s);
for (int i = 1; i <= n; ++i) {
printf("%d%c", dis[i], " \n"[i == n]);
}
return 0;
}
};
int main()
{
return gdb7::main();
}
弱化版 AC,标准版 TLE #1 & #6。