根據之前最短路徑算法里提到的,我們只要放松所有邊直到其全部失效就可以得到最短路徑
注意:圖中不能有負圈。否則當負圈中某個點經過這個負圈的所有邊的松弛操作后,這個點的的d[i]就會減小,此時會發現它可以通過這個負圈的松弛操作不斷使它自身不斷變小。對於存在負圈的圖,最短路無意義
由於是有關邊的算法,並且我們不需要關注邊之間的關系,只需要放松所有邊即可
模板入下:
struct edge {int from, to, cost}; edge es[MAX_E]; //邊 int d[MAX_V]; int V, E; for (int i = 1; i <= V; i++) d[i] = INF; d[s] = 0; while (true) { bool update = false; for (int i = 1; i <= E; i++) { edge e = es[i]; //d[e.from]=INF時距離為無窮大,沒有意義 if (d[e.from]!=INF && d[e.to]>d[e.from]+e.cost]) { d[e.to] = d[e.from] + cost; update = true; } } if (!update) break; }