離散複習資料之一(Dijkstra演算法)
Dijkstra演算法。
Dijkstra演算法,也可以叫做標記法。它的原理是把所求目標點到達該點的最短路徑標記起來,並且把每一個到達他的最短路徑的點標記起來。就像(5,4),就是表示到達它的最短的距離是5.它是通過4到達的,類似於遞迴的思想。
先來看一個最短路問題:
最開始,建圖。
在你們輸入的集合中,我們先要把關係圖做出來。比如說就是集合A={(a,b),(a,c),(b,c),(c,c)};把這個集合變成圖論的方式,也就是一個有向圖。
有關係的我們就把它們之間用一根線連線起來。沒有關係就不要去管他,
這樣我們就可以表示了A集合的有向圖。
在進行標記權值,每一個路的長度表示一個權值,對於每一個邊e,給定一個數W(e),則它稱為邊e的權。把樣的圖也稱為帶權圖。記住,A=<V,E,W>。
比如這個簡單的圖。表示的含義以及權值。
最後就是路徑的選擇。下面我們來看幾個圖的選擇與標記。
例 在下面交通圖中,權表示鐵路的長度。求v0到v5的最短路徑。屬於S的點用方框表示,屬於T的點用圓圈表示。
下面我將根據圖來進行說明,選擇的就標記起,未選擇的就是圓,選擇的就是正方形。未選擇的都是無窮大,
首先就是標記自己,因為自己到自己最近,距離為0,相應的可到達位置的距離改變,由無窮大變為可計算的距離。
到此也就一步一步的選擇完了。也就是說v0到v5的最短距離為9.
還有一種標記方法就是程式設計中最常用的一種標記方法。
就是標識他的來路。採用兩個資料去記錄。
在程式設計中,採用陣列和結構體,去完成標記,採用的思想就是並查集的思路和貪婪演算法,他求出來的不一定是最短的,但是它是僅次於最優解的最優解。原因在於貪婪演算法的缺點,他就是走最短的路,如果前面大,後面小的最短路的話就不可以了。
Dijkstra演算法:
下面看一個題目進行簡介。
一個總部和6個工地, 求從總部到各工地的最短路徑
標記的變數為2個,一個為“到你的最短距離的那點”,還有一個為“所求點到你的最短距離”,初始化,距離全為無窮大,出發到的點為S.未到達的點也為S(遞迴思想)
下面開始Dijkstra演算法:
未標記過的2,4,5,6,7 標記過的1,3
未標記過的3,4,5,6,7 標記過的1,3,2
未標記過的4,6,7 標記過的1,3,2,5
未標記過的4,7 標記過的1,3,2,5,6
未標記過的6,7 標記過的1,3,2,5,4
未標記過的 “空集” 標記過的1,3,2,5,6,7
該方法的虛擬碼是採用兩個集合的標記思路,一個為標記過的點集合,一個為未標記過的點集合。等到未標記點的集合為空集的時候,說明該演算法結束。
相應的還有表格路徑的表示方法如下:
該方法到此結束,謝謝觀看。如有不好的地方,其下方留言,我去一一改正!謝謝各位大佬觀看。謝謝!