dijistra
演算法作為一種最短路徑演算法,可以用來計算乙個節點到圖上其他節點的最短距離。
主要是通過啟發式的思想,由中心節點層層向外拓展,直到找到中點。
適用於無向圖和有向圖。
假設我們要計算節點a
到其它節點的最短距離
引入兩個集合(s
,u
),其中集合s
表示已經求出最短路徑的點(以及最短距離),集合u
表示還未求出最短路徑的點。集合中的元素用類似a(0)
形式表示,其中a
目標點為a
,(0)
表示目前已知最短路徑為0
(未直接連通的距離用∞
表示)。
初始時,s
集合中只有起始點,距離為0
,u集合中除了直接與a
點連通的點外,距離都為∞
。
第一次向外拓展,找出u
集合中距離最短的點(假設為b
)加入集合s
。並以b
點向外拓展,更新u
集合中的距離值。更新規則為,如果經過b
到某點的距離小於u
集合中記錄的結果,那麼則更新中集合u
中該點的距離值。
每執行一次步驟四,我們可以得出a
點距某個點的最短距離。
重複步驟四,直到u
的集合為空或是目標點不在u
集合中,也就計算出了需要的最短距離。
用圖表示解題過程:
同樣以上圖為例,我們如何保證第一次選擇得到結果a-> b (6)
是正確的最優解。
證明:
public class dijkstra {
public static int getshortestpath(int graph, int source){
if(graph == null || graph.length <= source)
throw new illegalargumentexception();
if(graph.length != graph[0].length)
throw new illegalargumentexception();
int n = graph[source].length;
// string route = new string[n];
//儲存結果集
int ret = new int[graph[source].length];
//儲存已確定最短路徑的點
int visited = new int[graph[source].length];
//初始化資料
arrays.fill(visited, 0);
arrays.fill(ret, integer.max_value);
ret[source] = 0;
//進行n次篩選
for(int i=0; i上述**見github。
演算法 Dijkstra演算法筆記
參考文章 隨記參考邏輯 dijkstra演算法採用的是一種貪心的策略。演算法的基本思想是 通過不斷更新的距離陣列,每次從距離陣列找到離源點最近的乙個且沒有掃瞄過的節點,然後以該頂點為中心進行bfs擴充套件,直到所有節點都掃瞄一遍,最終得到源點到其餘所有點的最短路徑 1 起點固定,若要記錄到達路徑,則...
Dijkstra演算法和Floyd演算法
最近做課設的時候用到了這兩個演算法,於是總結在這裡。dijkstra是求解乙個頂點到其他頂點的最短距離,演算法最簡單的實現方法是用乙個鍊錶或者陣列來儲存所有頂點的集合 q,所以搜尋 q 中最小元素的運算 extract min q 只需要線性搜尋 q 中的所有元素。這樣的話演算法的執行時間是 o n...
Prim演算法 與 dijkstra演算法
有時總將兩者搞混,兩者都是基於貪心策略,且都是將圖中頂點劃分為兩部分,每次取最小值。在這裡對兩者的演算法做乙個區分。prim演算法是解決圖的 最小生成樹 問題,在每次迴圈中,選取乙個點在s中,另乙個點在v s中,且兩點權值最小,直到v s為空。dijkstra演算法是解決圖的 最短路徑 問題,即從某...