最短路徑演算法

2021-04-13 23:55:20 字數 3336 閱讀 4542

個人覺得下面**有代表性:

最短路徑演算法原始碼(vb)

本人載**開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc/info 檔案為資料來源。其中a1,b1,c1是以fnode排序生成的陣列,a1對應fnode,b1對應tnode,c1對應length,同樣a2,b2,c2,是以tnode 生成的陣列。indexa1是對應某一起點與其相連的終點的個數,indexb1時對應某一終點與其相連的起點的個數,即其拓撲關係。

public function shortpath(startno as integer, endno as integer) as single

以開始點,結束點為引數。

dim result() as single

dim result1 as integer

定義結果點

dim s1 as single

dim min as single

dim ii, i, j, aa as integer

dim yc() as boolean

dim ycd() as boolean

dim rs1() as single

dim no() as integer

dim nopoint as integer

redim yc(1 to maxno) as boolean

redim ycd(1 to maxno) as boolean

redim rs1(1 to maxno) as single

redim result(1 to 2, 1 to maxno) as single

定義結果,其中result(1,maxno)為結果點,result(2,maxno)為結果長度。

for i = 1 to maxno// maxno為網中最大的節點數。

yc(i) = false //標記已經查過的點。

ycd(i) = false //標記已經作結果點用過的點

rs1(i) = 1e+38 //假設從起點到任一點的距離都為無窮大

next i

ll = startno //設定開始點。

yc(ll) = true //標記開始點為真。即已經作結果點用過。

j = 0

for aa = 1 to maxno

先從與開始點相連的終點尋找

for i = 1 to indexa1(2, ll) //以與ll點相連的起點的個數迴圈

result1 = b1(indexa1(1, ll) - i + 1)找出與ll點相連的終點的點號

s1 = c1(indexa1(1, ll) - i + 1) + result(2, ll)找出長度並求和

if yc(result1) = true then goto 200如果以被經查過進行下乙個

if ycd(result1) = true then//如果已經作為結果點判斷哪乙個長

if rs1(result1) >= s1 then//如果這一點到起點的長度比現在的路線長,替代

rs1(result1) = s1

result(1, result1) = ll//設定到這點的最短路徑的前一點為ll點(精華部分)

result(2, result1) = s1設定到這點的最短路徑長度

goto 200

else

goto 200

end if

end if

如果上面的條件都不符合則進行下面的語句

ycd(result1) = true

rs1(result1) = s1

result(1, result1) = ll

result(2, result1) = s1

每找到乙個點加一,為了下面的判斷

j = j + 1

redim preserve no(1 to j) as integer

從新 定義陣列並使其值為當前的點號

no(j) = result1

200 next i

再從與開始點相連的終點尋找,與上面一樣不再標註

for i = 1 to indexb2(2, ll)

result1 = a2(indexb2(1, ll) - i + 1)

s1 = c2(indexb2(1, ll) - i + 1) + result(2, ll)

if yc(result1) = true then goto 300

if ycd(result1) = true then

if rs1(result1) >= s1 then

rs1(result1) = s1

result(1, result1) = ll

result(2, result1) = s1

goto 300

else

goto 300

end if

end if

ycd(result1) = true

rs1(result1) = s1

result(1, result1) = ll

result(2, result1) = s1

j = j + 1

redim preserve no(1 to j) as integer

no(j) = result1

300 next i

設定最小為無窮大,最短路徑點為空

min = 1e+38

minpoint = null

(優化部分)

找出已經查過點中長度最短的點

for i = aa to j

if min > rs1(no(i)) then

ii = i

min = rs1(no(i))

minpoint = no(i)

end if

next i

如果沒有結果,即起點與終點沒有通路退出程式

if min = 1e+38 then exit function

(重點優化)將兩點互換,減少迴圈。

no(ii) = no(aa)

no(aa) = minpoint

標記已經作為結果點判斷過

yc(minpoint) = true

ll = minpoint

判斷結果點是否等於終點,如果等於則已經找到最短路徑

if minpoint = endno then exit for

next aa

返回最短路徑長度

stpath = result(2, endno)

end function

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...

最短路徑演算法

一,動態規劃 設起點為st,終點為ed。用dis v 表示v到st的距離。動態規劃方程 dis v min 初值dis st 0。偽 帶open標記,省略了追蹤陣列per dis st 0 open st true for all v st dis v open v false for 1 v 1 ...