最短路演算法(4) SPFA演算法

2021-07-25 05:43:07 字數 988 閱讀 7496

/*問題概述: 成都的大街上有n個路口,標號為1的路口是學校所在地,標號為n的路口是家所在地,m則表示在成都有幾條路,輸入3個整數a、b、c表示從

a路口到b路口有路可走,且要花費c分鐘,求從學校到家最短時間

輸入樣例: 對應輸出:

3 3 2

1 2 5

2 3 5

3 1 2

*//*spfa鬆弛法(省時演算法):

功能: 可以求出單個源點到其他頂點最短路徑

適用: 有向圖 √ 無向圖 √ 權值為正 √ 權值為負 √

複雜度: 2*n(複雜度低)

核心: 第一步: 建立乙個佇列q,初始時佇列裡只有乙個起始點(源點),再建立乙個陣列best記錄起始點到所有點的最短路徑,

並且初始化這個陣列,然後進行鬆弛操作.

(用佇列裡面的點去重新整理起始點到所有點的最短路,如果重新整理成功且重新整理點不在佇列中則把該點加入到佇列最後,重複執行直到隊列為空)

*/#include#include#includeusing namespace std;

int main(void)

; /*used陣列用來檢測第i個頂點是否在佇列中,是就為1*/

memset(cost, 127, sizeof(cost));

for(i=1;i<=m;i++)

for(i=1;i<=n;i++)

best[i] = 100000000;

best[1] = 0;

queueq; /*如果用佇列超時,則改為堆疊*/

q.push(1);

used[1] = 1; /*第乙個頂點進入佇列*/

while(q.empty()==0)}}

} printf("%d\n",best[n]);

} return 0;

}

最短路 SPFA演算法

spfa 是bellman ford的佇列優化,時效性相對好,時間複雜度o ke 與bellman ford演算法類似,spfa演算法採用一系列的鬆弛操作以得到從某乙個節點出發到達圖中其它所有節點的最短路徑。所不同的是,spfa演算法通過維護乙個佇列,使得乙個節點的當前最短路徑被更新之後沒有必要立刻...

最短路演算法 SPFA

單源最短路徑,不可以處理含負權邊的圖但可以用來判斷是否存在負權迴路 複雜度o ke k 2,e 為邊數 bellman ford 演算法的優化,實質與前演算法一樣,但優化的關鍵之處在於 只有那些前面被鬆弛過的點才有可能去鬆弛它們的鄰接點。include include include include...

最短路 spfa演算法

板子補完計畫絕讚繼續中 這篇部落格就來寫一寫spfa 這我居然板子都打錯了一次,我太弱啦!先來看一下定義 引自 首先說明,spfa是一種單源最短路徑演算法,所以以下所說的 某點的最短路徑長度 指的是 某點到源點的最短路徑長度 我們記源點為s,由源點到達點i的 當前最短路徑 為d i 開始時將所有d ...