题目: https://www.luogu.com.cn/problem/P4779
AC代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int inf = int(1e9);
const int N = 100010, M = 200050;
struct edge {
int next, to, w;
}edges[M];
int head[N];
int cnt;
int vis[N], dist[N];
int n, m, s;
void add(int u, int v, int w) {
edges[++cnt].next = head[u];
edges[cnt].to = v;
edges[cnt].w = w;
head[u] = cnt;
}
struct node {
int pos, dist;
bool operator < (const node& b) const{
return b.dist < dist;
}
};
priority_queue<node> q;
void dijkstra() {
memset(dist,0x3f,sizeof(dist));
memset(vis,0,sizeof(vis));
dist[s] = 0;
q.push(node{ s,0 });
while (!q.empty()) {
int u = q.top().pos;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = head[u]; i; i = edges[i].next) {
int to = edges[i].to;
if (dist[to] > dist[u] + edges[i].w) {
dist[to] = dist[u] + edges[i].w;
if (!vis[to]) {
q.push(node{ to,dist[to] });
}
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin >> n >> m >> s;
int u, v, w;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
add(u, v, w);
}
dijkstra();
for (int i = 1; i <= n; i++) {
cout << dist[i] << " ";
}
return 0;
}