这么奇怪 求解释 同样赏关注
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N = 5e5 + 10, INF = 0x3f3f3f3f;
struct edge {
int v, w;
};
vector<edge> e[N];
int d[N], vis[N]; //d[i]表示源点到i点最短距离 ,vis表示是否从小根堆弹出过
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;
int main() {
int n, m, s;
scanf("%d%d%d", &n, &m, &s);
//邻接表建图
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
e[u].push_back({ v,w });
}
for (int i = 1; i <= n; i++) {
d[i] = INF;
}
d[s] = 0; //源点初始化为0
heap.push({ 0,s });
while (!heap.empty()) {
auto u = heap.top().second;
heap.pop();
if (vis[u])
continue;
vis[u] = true;
for (auto& ed : e[u]) {
//first:源点到节点距离
//second:节点
int v = ed.v;
int w = ed.w;
if (!vis[v] && d[u] + w < d[v]) {
d[v] = d[u] + w;
heap.push({ d[u] + w, v });
}
}
}
for (int i = 1; i <= n; i++)
printf("%d ", d[i]);
}