演算法基本思想:每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑。
1、將所有的頂點分為兩個部分:已知最短路程的頂點集合p和未知最短路徑的頂點集合q
2、設定源點s到自己的最短路徑為0,若存在有源點能夠直接到達的頂點i則吧dis[i]設定為e[s][i]。同時把所有其它不能直接到達的頂點的最短路徑設定為∞
3、在集合q的所有頂點中選擇乙個離源點s最近的頂點u即dis[u]最小,加入到集合p。並考察所有以點u為起點地邊,對每條邊進行鬆弛操作。
4、重複第三步,直到集合q為空,演算法結束。最終dis陣列中的值就是源點到所有頂點的最短路徑。
//dijketra演算法
intmain()
//初始化dis陣列,這裡是1號頂點到其餘各個頂點的初始路程。
for (i = 1; i <= n; i++)
dis[i] = e[1
][i];
//book陣列初始化,book陣列用來記錄當前點是否被訪問,訪問1 else0
for (i = 1; i <= n; i++)
book[i] = 0
; book[
1] = 1;//
一號頂點標記
//核心演算法
for (i = 1; i <= n - 1; i++)
}book[u] = 1;//
標記當前點被訪問
for (v = 1; v <= n; v++)}}
//輸出結果
for (i = 1; i <= n; i++)
getchar(); getchar();
return0;
}
單源最短路徑問題 Bellman Ford演算法
講真,剛看到這個演算法的時候我一臉懵逼,這是什麼鬼,不過這也正常,大部分時候我看到乙個新的演算法總是一臉懵逼 笑 不過這沒什麼,像三體裡說的 弱小和無知不是生存的障礙,傲慢才是 所以,好好學就ok啦 說了那麼多廢話,接下來進入正題啦!所謂最短路問題是圖論中最基礎的問題,是給定兩個點,在以這2個點為起...
單源最短路
題目描述 給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出n行,每行n個用空格分隔的整數,其中第i個整數表示從點s出發...
單源最短路
恢復內容開始 dijkstra spfa floyd多源變單源 熱浪 模板題 使用spfa過 spfa 從佇列中取出點進行鬆弛操作 使用st記錄點是否還在佇列中 如果這個點本來就存在佇列中那麼就重複加入點了void spfa int s 信使 廣播式求時間 求廣播所有點的最短時間 每個點接受到向他的...