講真,剛看到這個演算法的時候我一臉懵逼,這是什麼鬼,不過這也正常,大部分時候我看到乙個新的演算法總是一臉懵逼(笑),不過這沒什麼,
像三體裡說的「弱小和無知不是生存的障礙,傲慢才是」,所以,好好學就ok啦(*^_^*)。
說了那麼多廢話,接下來進入正題啦!
所謂最短路問題是圖論中最基礎的問題,是給定兩個點,在以這2個點為起點和終點的路徑中找到最短的那條。
什麼是最短呢?我們會有這個疑惑,是經過的頂點數或者邊數最少?還是經過的邊的權值和最小呢?
在這裡指的是經過的邊的權值和最小。而單源最短路徑問題是固定乙個頂點,求它到其他所有點的最短路的問題。
bellman-ford演算法的基本思想是遍歷所有的邊,更新從起點到所有頂點的路徑權值和。閒話少說,放碼過來:
struct edge;//這是邊,from,to為某條邊的起點與終點,cost為權值
int v,e;//v為圖中頂點個數,e為圖中的邊數
int d[v];//記錄最短路徑
struct edge es[e]//儲存邊的陣列
void shortest_path(int s)
}if(!update) break;//這一步很關鍵,如果單單迴圈一次for的話頂點有的有被更新,
有的沒有,所以要用while迴圈,但什麼時候跳出while迴圈呢?
顯然是當所有的路徑都更新了的時候。但怎麼判斷所有的路徑都被更新了呢?
很簡單,當一次for迴圈沒有任何乙個路徑被更新時。
}return;
}
不知道你們注意到沒有,假如,假如,這個圖中有負圈的話,更新操作就不是有限的,就無法跳出while迴圈,所以,要先檢查圖中是否存在負圈。怎麼檢查呢?只要檢查迴圈次數就可以了。為什麼呢?因為在不存在負圈的情況下,最短路不會經過同乙個頂點2次,也就是說,最多通過v-1條邊,while迴圈最多執行v-1次,反之,如果存在負圈,那麼第v次迴圈也會更新d的值。以此來檢查是否有負圈。
bool find_negative_loop()}}
return
false;
}
好了,先這樣吧。 單源最短路徑問題
如圖,求v0到其他頂點的最短路徑及其長度,廢話少說,用dijkstra演算法。我在 資料結構 c語言版 裡面的 的基礎上寫了乙個直接儲存路徑的版本。看 include includeusing namespace std define maxint 1000000 src 為源節點 g 有向圖的鄰接...
單源最短路徑問題
一 單源最短路徑問題 1 求下列多級圖的單源最短路徑,寫出求解過程。根據cost i min可知 cost為 1 2 3 4 5 6 7 8 9 10 d為 1 2 34 5 6 78 9 10 p為 1 2 3 4 5 6 7 8 9 10 計算過程如下 初始 cost 1.n 0 cost 9 ...
單源最短路徑問題
給定帶權有向圖g v,e 其中每條邊的權是非負實數。給定v中的乙個頂點,稱為源。現在要計算從源到所有其它各頂點的最短路長度,這裡路的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。每條邊上標註有字母和數字,在字母旁邊的數字為路長。演算法從優先佇列中取出具有最小當前路長的結點作為當前擴充套件...