算法使用的是dijkstra的堆优化(set) 下面是代码:
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int un = 2147483647;
int n, m, s;
vector< pair<int, int> > g[10005];
int dist[10005];
void dsa(int st, int en) {
memset(dist, 127, sizeof(dist));
dist[st] = 0;
set< pair<int, int> > q;
q.clear();
for (int i = 1; i <= n; ++ i) {
q.insert({dist[i], i});
}
while (!q.empty()) {
int u = q.begin()->second; q.erase(q.begin());
if (dist[u] > (1 << 30) || u == en) break;
for (auto i : g[u]) {
int v = i.first, w = i.second;
if (dist[u] + w < dist[v]) {
q.erase({dist[v], v});
dist[v] = dist[u] + w;
q.insert({dist[v], v});
}
}
}
if (dist[en] > (1 << 30)) cout << un << " ";
else cout << dist[en] << " ";
}
void solve() {
cin >> n >> m >> s;
for (int i = 1; i <= m; ++ i) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
}
for (int i = 1; i <= n; ++ i) {
dsa(s, i);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
solve();
}