只要图中没有负环就可以用SPFA(负权图首选)%99的图都没有负环
dijkstra中用spfa,spfa可能被网格图卡掉。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
vector<pair<int, int>> graph[N]; // graph[u] = {v, w}
int dist[N];
bool st[N]; // 记录是否在队列中
int spfa() {
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
queue<int> q;
q.push(1);
st[1] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
st[u] = false;
for (auto [v, w] : graph[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
if (!st[v]) {
q.push(v);
st[v] = true;
}
}
}
}
return dist[n] == 0x3f3f3f3f ? -1 : dist[n];
}
int main() {
scanf("%d%d", &n, &m);
while (m--) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
graph[a].emplace_back(b, c); // 添加边
}
int t = spfa();
if (t == -1) puts("impossible");
else printf("%d\n", t);
return 0;
}
632

被折叠的 条评论
为什么被折叠?



