[AcWing 851] spfa求最短路
阿新 • • 發佈:2022-05-07
點選檢視程式碼
#include<iostream> #include<cstring> #include<queue> using namespace std; const int N = 1e5 + 10; int n, m; int h[N], e[N], ne[N], w[N], idx; int dist[N]; bool st[N]; void add(int a, int b, int c) { e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++; } int spfa() { memset(dist, 0x3f, sizeof(dist)); dist[1] = 0; queue<int> q; q.push(1); st[1] = true; while (q.size()) { int t = q.front(); q.pop(); st[t] = false; for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (dist[j] > dist[t] + w[i]) { dist[j] = dist[t] + w[i]; if (!st[j]) { q.push(j); st[j] = true; } } } } return dist[n]; } int main() { cin >> n >> m; memset(h, -1, sizeof(h)); for (int i = 0; i < m; i ++) { int a, b, c; cin >> a >> b >> c; add(a, b, c); } int t = spfa(); if (t == 0x3f3f3f3f) puts("impossible"); else cout << dist[n] << endl; return 0; }
- 在 dijkstra 的基礎上進行優化,只有當隊頭節點出隊時,隊頭的鄰邊才會進行更新;
- spfa 可以用來處理負權圖的情況;