迪傑斯特拉演算法詳解

2021-09-28 18:48:35 字數 3663 閱讀 4185

迪傑斯特拉(dijkstra)演算法是典型最短路徑演算法,用於計算乙個結點到其他結點的最短路徑。 它的主要特點是以起始點為中心向外層層擴充套件(廣度優先搜尋思想),直到擴充套件到終點為止。

看乙個應用場景和問題:

戰爭時期,勝利鄉有7個村莊(a, b, c, d, e, f, g) ,現在有六個郵差,從g點出發,需要分別把郵件分別送到 a, b, c , d, e, f 六個村莊

各個村莊的距離用邊線表示(權) ,比如 a – b 距離 5公里

問:如何計算出g村莊到 其它各個村莊的最短距離?

如果從其它點出發到各個點的最短距離又是多少?

設定出發頂點為v,頂點集合v,v到v中各頂點的距離構成距離集合dis,dis,dis集合記錄著v到圖中各頂點的距離(到自身可以看作0,v到vi距離對應為di)

從dis中選擇值最小的di並移出dis集合,同時移出v集合中對應的頂點vi,此時的v到vi即為最短路徑

更新dis集合,更新規則為:比較v到v集合中頂點的距離值,與v通過vi到v集合中頂點的距離值,保留值較小的乙個(同時也應該更新頂點的前驅節點為vi,表明是通過vi到達的)

重複執行兩步驟,直到最短路徑頂點為目標頂點即可結束

這裡以c為出發點

我們首先定義乙個dis陣列

visited 陣列記錄是否被訪問過

第一步 我們將c點到各個的頂點的距離放入到dis陣列中 (dis陣列始終代表的是以c頂點到各個路徑的距離 我們就是修改這個陣列)

dis:7 n 0 n 8 n n

我們遍歷dis陣列 尋找距離c點距離最近的頂點 這時候返回座標0 也就是我們的a頂點

取出a頂點到各個頂點的距離

a: 0 5 7 n n n 2

此時遍歷a的距離陣列 我們找出 dis(c)以a為中間節點 和 c 到各個頂點距離比較 例如 c到 b為n 而以 a為中間節點 我們得到 7+5 e: n n 8 n n 5 4

此時遍歷e的距離陣列 我們找出 dis(c)以e為中間節點 和 c 到各個頂點距離比較 例如 c到 f為n 而以 e為中間節點 我們得到 8+5 <13 我們修改 dis陣列的中的值 與上面類似

dis: 7 12 0 n 8 13 9

我們將 e標記為訪問過

我們遍歷dis陣列尋找距離c頂點最近的頂點 返回座標 6 即我們的g頂點 (因為距離7,8的a,e頂點 我們已經標記訪問過了)

g: 2 3 n n 4 6 n

此時遍歷g的距離陣列 我們找出 dis(c)以g等為中間節點 和 c 到各個頂點距離比較 例如 c到 f為n 而以 e為中間節點 我們得到 8+5 <13 我們修改 dis陣列的中的值 與上面類似

dis : 7 12 0 n 8 13 9

b : 5 n n 9 n n 3

以此下去

分別是dis : 7 12 0 21 8 13 9

f : n n n 4 5 n 6

dis : 7 12 0 17 8 13 9

c : 7 n n n 8 n n

dis : 7 12 0 21 8 13 9

**實現:

public class dijkstraalgorithm ;

//鄰接矩陣

int matrix = new int[vertex.length][vertex.length];

final int n = 65535;// 表示不可以連線

matrix[0]=new int;

matrix[1]=new int;

matrix[2]=new int;

matrix[3]=new int;

matrix[4]=new int;

matrix[5]=new int;

matrix[6]=new int;

//建立 graph物件

graph graph = new graph(vertex, matrix);

//測試, 看看圖的鄰接矩陣是否ok

graph.showgraph();

//測試迪傑斯特拉演算法

graph.dsj(2);//c

graph.showdijkstra();

}}class graph

//顯示結果

public void showdijkstra()

// 顯示圖

public void showgraph() }

//迪傑斯特拉演算法實現

/***

* @param index 表示出發頂點對應的下標

*/public void dsj(int index) }

//更新index下標頂點到周圍頂點的距離和周圍頂點的前驅頂點,

private void update(int index)

} }}// 已訪問頂點集合

class visitedvertex

/*** 功能: 判斷index頂點是否被訪問過

* @param index

* @return 如果訪問過,就返回true, 否則訪問false

*/public boolean in(int index)

/*** 功能: 更新出發頂點到index頂點的距離

* @param index

* @param len

*/public void updatedis(int index, int len)

/*** 功能: 更新pre這個頂點的前驅頂點為index頂點

* @param pre

* @param index

*/public void updatepre(int pre, int index)

/*** 功能:返回出發頂點到index頂點的距離

* @param index

*/public int getdis(int index)

/*** 繼續選擇並返回新的訪問頂點, 比如這裡的g 完後,就是 a點作為新的訪問頂點(注意不是出發頂點)

* @return

*/public int updatearr()

} //更新 index 頂點被訪問過

already_arr[index] = 1;

return index; }

//顯示最後的結果

//即將三個陣列的情況輸出

public void show()

system.out.println();

//輸出pre_visited

for(int i : pre_visited)

system.out.println();

//輸出dis

for(int i : dis)

system.out.println();

//為了好看最後的最短距離,我們處理

char vertex = ;

int count = 0;

for (int i : dis) else

count++;

} system.out.println();}}

迪傑斯特拉演算法詳解

1 迪傑斯特拉演算法介紹 迪傑斯特拉演算法是典型最短路徑演算法,用於計算圖或網中某個特定頂點到其他所有頂點的最短路徑。主要特點是以起始點為中心向外,層層擴充套件,直到擴充套件覆蓋所有頂點。2 迪傑斯特拉演算法思想 設g v,e 為乙個帶全有向圖,把圖中頂點集合v分成兩組。第一組為已求出最短路徑的頂點...

迪傑斯特拉演算法

if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...