看了下讨论区 好像#3不是数据比较大的 不知道哪里出了问题
用的是优先队列,对重复的边和到自己的边做了判定
#include <bits/stdc++.h>
using namespace std;
int n, m, s, u, v, w;
typedef struct {
int next;
int weight;
} edge;
typedef struct {
int dis;
int num;
} node;
vector<vector<edge>> adj;
vector<bool> vis;
vector<node> d;
auto cmp = [](node &l, node &r) { return (l.dis > r.dis); };
priority_queue<node, vector<node>, decltype(cmp)> minHeap(cmp);
void dijkstra() {
int visNum = 1;
vis[s] = true;
d[s].dis = 0;
minHeap.push(d[s]);
for (int i = 0; i < adj[s].size(); i++) {
d[adj[s][i].next].dis = adj[s][i].weight;
minHeap.push(d[adj[s][i].next]);
}
while (visNum != n) {
node temp;
while (true) {
temp = minHeap.top();
minHeap.pop();
if (!vis[temp.num]) break;
}
vis[temp.num] = true;
for (int i = 0; i < adj[temp.num].size(); i++) {
int newDis = adj[temp.num][i].weight + temp.dis;
int oldDis = d[adj[temp.num][i].next].dis;
if (!vis[adj[temp.num][i].next] && newDis < oldDis) {
node tem;
tem.dis = newDis;
d[adj[temp.num][i].next].dis = tem.dis;
tem.num = adj[temp.num][i].next;
minHeap.push(tem);
}
}
visNum++;
}
}
int main() {
cin >> n >> m >> s;
adj.resize(n + 1);
vis.resize(n + 1, false);
d.resize(n + 1);
for (int i = 1; i <= n; i++) {
d[i].dis = 0x7fffffff;
d[i].num = i;
edge temp;
temp.next=i;
temp.weight=0;
adj[i].push_back(temp);
}
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
short flag = 0;
for (int j = 0; j < adj[u].size(); j++) {
if (adj[u][j].next == v) {
if (adj[u][j].weight <= w) {
flag = 2;
break;
} else {
flag = 1;
adj[u][j].weight = w;
}
}
}
if (flag == 0) {
edge temp;
temp.next = v;
temp.weight = w;
adj[u].push_back(temp);
}
}
dijkstra();
for (int i = 1; i <= n; i++) cout << d[i].dis << " ";
return 0;
}