最短路徑演算法

2021-07-10 16:19:32 字數 1958 閱讀 4868

(1)確定s集與v集;

(2)找到v集中權值最小的乙個pk,並將其從v集中移入s集;

(3)以pk為中間點,更新v集中的所有權值;

(4)重複(2)(3);結束條件為v集為空

缺陷:對於有向圖和帶負權的圖就沒有用了。

#include 

#define node_count 6

struct nodeall[node_count];

#define inf 0xfffffff

int maps[node_count][node_count] = ,,,

,,

};void initset(int src)

}int getvmin(void)}}

return sel;

}int dijkstra(int src)}}

}void main(void)

起始點為i,終止點為j,中間點為k,頂點格式n; i,

j,k∈

(0,n

−1)

(1)確定乙個中間點k

(2)更新所有i->j的權值

可用於計算有向圖和帶負權的圖

#include 

#define node_count 6

#define inf 0xffffff

int maps[node_count][node_count] = ,,,

,,

};void floyd(int src)

}

}//}

}}void main(void)

但是有時候我們需要知道該最短路徑怎麼辦呢?

我們需要將第二步細化:(2)更新所有i->j的權值

這裡我們加入乙個記錄路徑的變數path;再(1)之前我們需要對path進行初始化;

調整後的演算法流程為:

(1)初始化path,將inf全部設為不能走通的路徑;可走通的話就講其前驅記下;比如: (i

,j,i

nf)=>pa

th[i

][j]

=−1;

(i,j

,10)=>pa

th[i

][j]

=i;

(2)確定乙個中間點k

(3)更新所有i->j的權值,同時更新路徑如果

maps

[i][

k]+m

aps[

k][j

]ps[i

][j]

;則pa

th[i

][j]

=pat

h[k]

[j];

且map

s[i]

[j]=

maps

[i][

k]+m

aps[

k][j

];更新後的演算法程式為:

void floyd(int src)

}// 只求第src個點到各個點的最短路徑

i = src;

// (1)確定中間點k

for (k = 0; k < node_count; k++)

}

}//}

}}

列印路徑輸出結果:

printf("%d",to);

while (path[from][to] != from)

printf("<-%d",from);

printf("\n");

輸出結果為倒序輸出。

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的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 如果...

最短路徑演算法

個人覺得下面 有代表性 最短路徑演算法原始碼 vb 本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔...