【bellman-ford】AcWing853.有邊數限制的最短路——模板題
阿新 • • 發佈:2022-05-29
AcWing853.有邊數限制的最短路
題解
存在負權迴路可能會導致無法求最短路,比如說圖中 2的自環,沒轉一圈距離-1,我們求1到5的距離可以轉無窮圈2,即1到2的距離為 -無窮
迴圈n次求的是長度不超過n條邊的最短路
#include <iostream> #include <cstring> using namespace std; const int N = 10010, M = 510; int n, m ,k; int dist[M], backup[M]; //backup用於備份由於bellaman_ford會改變前面的dist[a]導致結果不對 struct{ int a, b, w; }edge[N]; void bellman_ford() { memset(dist, 0x3f3f3f3f, sizeof dist); dist[1] = 0; for(int i = 0; i < k; ++i) { memcpy(backup, dist, sizeof dist); for(int j = 0; j < m; ++j) { auto t = edge[j]; dist[t.b] = min(dist[t.b], backup[t.a] + t.w); } } } int main() { cin >> n >> m >> k; int a, b, w; for(int i = 0; i < m; ++i) { cin >> a >> b >> w; edge[i] = {a, b, w}; } bellman_ford(); //負權邊可能會導致1到n的不可能路線變小 if(dist[n] > 0x3f3f3f3f / 2) cout << "impossible" << endl; else cout << dist[n] << endl; return 0; }