迪傑斯特拉演算法學習筆記
迪傑斯特拉演算法用於求解最短路徑問題,具體地說是求解乙個有向圖(或無向圖,無向圖是有向圖的乙個特例)中乙個點到其餘各點的最短路徑,既然是求解最短路徑問題,自然這裡所描述的圖的邊都是具有權值的。比如我們可以用這個演算法計算複雜的網路中乙個節點到另外乙個節點的最短路徑,網路不單指網際網路,也可以是交通網路或者其他什麼的,同理路徑未必就是以km或m什麼的為單位進行衡量,也可以是時間、金錢或者其他什麼概念。
演算法敘述:
乙個圖g表示為點和邊的集合,假設圖g的點集為i,邊集為e,那麼g=,要求解i中乙個點o到i中除了o點之外所有點的最短路徑,首先把i進行劃分,把i中除了o以外的所有節點劃為乙個周邊點集合p,並稱o為原點,我們製作乙個點的集合s,它用來存放節點x,x是這樣的一些節點,o到x(o—……—x)的最短距離已經為演算法求得,自然在演算法開始之前s是個空集合。
還有乙個值得注意的概念,e中有多少條邊呢,我們通常可能會覺得e中的邊數是可變的,但實際上我們可以求得e中的變數,我們假設num(i)是i中點的個數,那麼e中邊的個數num(e)就是num(i)的平方,因為在實現演算法的時候我們認為那些彼此之間沒有邊相連線的點它們變得權值為無窮大。根據上面的描述可知原點o可以「直接到達」p中的每乙個點x,只不過距離某些x太過「遙遠」,這個距離在概念上是無窮大。
下面對演算法描述:
演算法目的:求解原點o到任一周邊點x的最短路徑。
演算法步驟:
1)找到o到p中各點的最小值,經過查詢o—x最小;
2)找s中第乙個點s0到集合p中所有點的最短距離,經過查詢s0—px0最小,那麼我們找s中第二個點s1集合p中所有點的最短距離,經過查詢s1—px1最小,如此下去,直至我們找到了集合s中最後乙個元素sn到p中所有點最短距離sn—pxm,這時我們需要找到o—s0—px0, o—s1—px1……o—sn—pxm中最短的乙個o—si—pxj;
3)比較o—x,o—si—pxj兩條路徑,如果前者更小則將x從p中剔除掉並納入s中,如果後者更小則將pxj從p中剔除掉並納入到s中,假設納入到s中這個點位y,記錄o—y的最小值,共以後計算使用;
4)這一步我們要判斷p是否為空集,如果p為空集演算法結束,如果p中還有元素,重複上邊三步。
演算法會執行到p為空集時退出,p為空集表示s=i-;在上面的描述過程中得知,o到s中的元素的最短距離已被演算法求得,到這時s中具有了除o以外點集i中的所有元素,所以o到圖中任一一點的距離均已求得。
那麼為什麼最短距離是o—x或者o—si—pxj,而不會是o—pxi—pxj這樣的形式呢,因為如果有這麼一條路徑的話,那麼o—pxi一定小於o—pxi—pxj,就是說o—pxi才是真正的最短路徑,而不會是o—pxi—pxj,而o—pxi所表示的意思不正是和o—x相同的嗎?
這是畢業後在遇到ospf(乙個路由演算法)時突然想起當初學習迪傑斯特拉時,頗有感悟,所以寫了這個學習筆記,本是藉此彌補大學沒有努力學習的遺憾,後來無意中發現有人**了此文,不勝羞愧,遂整理一番。
最短路徑 迪傑斯特拉演算法
例如,要求下圖v0到v8的最短路徑 所以我們可以找到這樣的一條最短路徑 下面是他的鄰接矩陣 偽 如下 define maxvex 9 define infinity 65535 typedef int patharc maxvex 用於儲存最短路徑下標的陣列 typedef int shortpat...
迪傑斯特拉最短路徑演算法
時間限制 1 sec 記憶體限制 32 mb 提交 27 解決 17 提交 狀態 命題人 外部匯入 題目描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的...
最短路徑(迪傑斯特拉演算法)
源 include define maxint 32767 表示極大值 define mvnum 100 最大頂點數 typedef char vertextype 定義資料型別 typedef int arctype typedef struct amgraph int locatevex amg...