(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 檔...