1. 程式人生 > >離散複習資料之一(Dijkstra演算法)

離散複習資料之一(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

該方法的虛擬碼是採用兩個集合的標記思路,一個為標記過的點集合,一個為未標記過的點集合。等到未標記點的集合為空集的時候,說明該演算法結束。

相應的還有表格路徑的表示方法如下:

該方法到此結束,謝謝觀看。如有不好的地方,其下方留言,我去一一改正!謝謝各位大佬觀看。謝謝!