迪傑斯特拉(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演算法是很有代表性的最短...