問題描述
下面以乙個例子來說明單源最短路徑問題:在下圖所給的有向圖g中,每一邊都有乙個非負邊權。要求圖g的從源頂點s到所有其他頂點的最短路徑。
演算法思想
解單源最短路徑問題的優先佇列式分支限界法用一極小堆來儲存活結點表。其優先順序是結點所對應的當前路長。
(1)從圖g的源頂點s和空優先佇列開始。
(2)結點s成為擴充套件節點,它的兒子結點被依次插入堆中。
(3)從堆中取出具有最小當前路長的結點作為當前擴充套件結點,並依次檢查與當前擴充套件結點相鄰的所有頂點。
(4)如從當前擴充套件結點i到頂點j有邊可達,且從源出發,途經頂點i再到頂點j的路徑的長度小於當前已得到的s到j的最優路徑長度,則將該頂點作為活結點插入到活結點優先佇列中。
(5)這個結點的擴充套件過程一直繼續到活結點優先隊列為空時為止。
演算法中,利用結點間的控制關係進行剪枝。從源頂點s出發,2條不同路徑到達圖g的同一頂點。由於兩條路徑的路長不同,因此可以將路長長的路徑所對應的樹中的結點為根的子樹剪去
//當前擴充套件結點e ,內含頂點編號e.i,
//c[n][n]是距離矩陣,dest[j]是當前到達j頂點的最短距離。
while (true)
// 取下一擴充套件結點
try
// 優先佇列空
catch (outofbounds)
}
分支限界法之單源最短路徑問題
1 問題描述 在下圖所給的有向圖g中,每一邊都有乙個非負邊權。要求圖g的從源頂點s到目標頂點t之間的最短路徑。下圖是用優先佇列式分支限界法解有向圖g的單源最短路徑問題產生的解空間樹。其中,每乙個結點旁邊的數字表示該結點所對應的當前路長。找到一條路徑 目前的最短路徑是8,一旦發現某個結點的下界不小於這...
單源最短路徑(分支限界)
優先順序 當前路徑長度 剪枝函式 由於圖g中各邊的權均非負,所以結點所對應的當前路長也是解空間樹中以該結點為根的子樹中所有結點對應的路長的乙個下界。擴充套件結點的過程中,一旦發現乙個結點的下界不小於當前找到的最短路長,則演算法剪去以該結點為根的子樹。資料的儲存 二維陣列type g n n 儲存鄰接...
單源最短路徑分支限界法之java實現
public class short int c int n 4 int dist int c graph g new graph n,prev,c,dist g.shortestpath 1 system.out.println dist n class minheapnode 迴圈佇列 clas...