首先,提出兩點:一、如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖;二、如果把無向圖中的每一條邊(vi,vj)都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。
帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路徑上所經過邊的權值之和為該路徑上的帶權路徑長度,那麼在兩個結點間的所有路徑中,路徑長度值最小的稱做最短路徑(距離)。
對於有向帶權圖中從乙個確定結點(源點)到其餘各結點的最短路徑問題,狄克斯特拉(dijkstra)提出了乙個按照路徑長度遞增的順序逐步產生最短路徑的構造演算法。
dijkstra演算法:設定兩個結點的集合s和t,集合s中存放已找到最短路徑的結點,集合t存放當前還未找到最短路徑的結點。(1)初始狀態,s只包含源點,設為v0;(2)然後從t中選擇出由源點v0到其中某一結點路徑長度最短的結點u,加入到集合s中;(3)集合s中每加入乙個新的結點u都要修改源點v0到集合t中剩餘結點的當前最短路徑長度值;(4)那麼這最小的當前最短路徑長度值為,原來的當前最短路徑長度值和從源點v0過結點u到到達該結點的路徑長度相比,取小的那個值。(5)不斷重複,知道集合t中的結點全部加入到集合s中為止。
接下來實現演算法:
package map;
/*** @author sun
*///dijkstra類和函式設計
public class dijkstra {
static final int maxweight = 9999;
public static void dijkstra(adjmwgraph g,int v0,int distance,int path)throws exception{
//帶權圖g從下標v0結點到其他結點的最短距離distance
//和相應的目標結點的前一結點下標path
int n = g.getnumofvertices();
int s = new int[n];//s用來存放n個結點的標記
int mindis,u=0;//u為目標結點下標
//初始化
//構造圖
public static void creategraph(adjmwgraph g,object v,int n
,rowcolweight rc,int e)throws exception{
for(int i=0;i
對於此問題,弗洛伊德(floyd)提出了一種遞推的演算法來求解,即弗洛伊德演算法。
用矩陣cost[i][j]來存放圖g中下標為i的結點到下標為j的結點之間的權值,那麼可以通過遞推構造乙個矩陣序列a0,a1,···,an來求每對結點之間的最短路徑。其中,ak[i][j](0弗洛伊德演算法的思想可用地推公式描述:
Dijkstra 最短路徑
dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...
dijkstra最短路徑
hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...
Dijkstra最短路徑
演算法筆記 dijkstra演算法解決的是單源最短路問題,即給定圖g v,e 和起點s 起點又稱為源點 求從起點s到達其它頂點的最短距離 dijkstra演算法的策略是 設定集合s存放已被訪問的頂點,然後執行n次下面的兩個步驟 n為頂點個數 1.每次從集合v s中選擇與起點s的最短距離最小的乙個頂點...