堆优化dijkstra,#3 过不去
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#define MAXN 200001
using namespace std;
struct E {
int v, w;
};
struct cmp {
bool operator()(E a, E b) {
return a.w > b.w;
}
};
int n, m, s;
vector<E> graph[MAXN];
int dist[MAXN];
int vis[MAXN];
priority_queue<E, vector<E>, cmp> heap;
void dijkstra() {
fill(dist + 1, dist + n + 1, INT_MAX);
fill(vis + 1, vis + n + 1, false);
dist[s] = 0;
heap.push({s, 0});
while (!heap.empty()) {
int u = heap.top().v; heap.pop();
if (vis[u])
continue;
for (E e : graph[u]) {
int v = e.v, w = e.w;
if (!vis[v] && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
heap.push({v, dist[v]});
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &s);
for (int i = 1, u, v, w; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
graph[u].push_back({v, w});
}
dijkstra();
for (int i = 1; i <= n; i++) {
printf("%d ", dist[i]);
}
printf("\n");
}