Bellman-Ford 算法


根據之前最短路徑算法里提到的,我們只要放松所有邊直到其全部失效就可以得到最短路徑

注意:圖中不能有負圈。否則當負圈中某個點經過這個負圈的所有邊的松弛操作后,這個點的的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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM