本人載**開發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
最短路徑演算法原始碼 VB
public function shortpath startno as integer,endno as integer as single 以開始點,結束點為引數。dim result as single dim result1 as integer 定義結果點 dim s1 as single...
Graphx 最短路徑原始碼解析
下面主要是對spark圖計算框架graphx中的單源點最短路徑的原始碼進行解析。test shortpaths 構造有向圖 val edges sc.parallelize edgeseq map val graph graph.fromedgetuples edges,1 要求最短路徑的點集合 v...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...