演算法 最短路演算法

2022-07-28 13:45:22 字數 1403 閱讀 5525

最短路演算法用於求帶權有向圖中,兩點之間的最近距離。它通過不斷擴大已知的最短路徑,直到最短路徑覆蓋終點為止。由下面的程式可以看書,它的時間複雜度為o(n^3)。下面舉一簡單例子說明最短路演算法的步驟。

想求v0到v7的最短路徑,初始的時候,只知道v0距離自己的最短距離為0.

使用乙個close陣列儲存以求得與v0的最短距離,如未求得的複製為-1. 開始時,close[0]=0;

(1)遍歷close裡面的點,找出所有與close點相鄰但不在close裡面的點。

剛開始只有v0在close裡面,與它相鄰的點有v1、v2、v3。

(2)找出這些點中,距離v0最近的乙個點。

例如點i是close裡面的點,j是i的鄰接點,那麼j與v0的最近距離=ij距離+i與v0的最短距離。由於i是close裡面的點,i與

v0的最短距離已知,就是close[i]。

此時v3距離v0距離為close[0]+1,比v2和v1都小,因此v3選入close,close[3]=1。最短路徑的範圍已經擴大到v0到v3.

(3)此時,與v0-v3這一段已知最短路相鄰的點有v1v2v6,v1距離v0最短距離=2,v6最短距離=v3到v6距離9(圖漏寫了)+close[3]=10,v2到v0的距離顯然是8.因此,這三個點中距離v0最短的點是v1,因此v1收入close,close[1]=1。此時,已知最短路的範圍已經擴到到v1-v0-v3.

一直重複,每次加入乙個與close(或者說是已知最短路)相鄰的點,直到要求的終點加入close就求得起點到終點的最短路。

整個最短路演算法,其實就是乙個最優路徑不斷擴大的過程,一開始只有乙個起點,然後每次新增乙個與起點距離最短的鄰接點,直到找到終點位置。上圖展示了擴充套件的過程,圖1從v0擴充套件到v3.圖2擴充套件到v1-v0-v3,圖3擴充套件到v4-v1-v0-v3.

下面是**:

int

minpath(),,,

,,,,

};int close[8];//

存放已經找到與第乙個點最短短的點,陣列的值是改點與起點的最短距離

inti,j;

close[

0]=0;//

起點距離自己的距離為0

for(i=1;i<8;++i)

close[i]=-1;//

沒找到的設為-1

while(close[7]==-1)}}

}close[imin]=min;//

所有相鄰非close點中,與起點最近的點加入close

}

return close[7

];}

最短路演算法

常用的最短路演算法有三種 disjkstra,floyd,ballman floyd 一 disjkstra演算法 dijkstra演算法要求圖上的權非負數。同樣使用於無向圖 html view plain copy include stdio.h hdu 2544 define maxsum 0x...

最短路演算法

最短路演算法有很多,具體哪個好,和資料是有很大關係的 從起點開始向外擴充套件,最壞o v e 實際體驗比o e log v 的dijkstra可能快 include include define max e 4002 define max v 1002 define inf 0x3f3f3f usi...

最短路演算法

參考 一 dijkstar 迪傑斯特拉 演算法 簡介 此演算法按路徑長度 next點 遞增順序產生最短路。步驟 1.先將點集v分成兩組 s 已求出最短路徑的集合 t v s 尚未確定最短路徑的集合 2.初始化 使s t t中頂點對應的距離值,若存在,則為弧上的權值,如不存在則為inf 無窮 3.從t...