單源負邊最短路演算法 Spfa

2021-09-02 22:02:17 字數 1116 閱讀 6057

**:

求單源最短路的spfa演算法的全稱是:shortest path faster algorithm。 

很多時候,給定的圖存在負權邊,這時類似dijkstra等演算法便沒有了用武之地,而bellman-ford演算法的複雜度又過高,spfa演算法便派上用場了。有人稱spfa演算法是最短路的萬能演算法。

簡潔起見,我們約定有向加權圖g不存在負權迴路,即最短路徑一定存在。當然,我們可以在執行該演算法前做一次拓撲排序,以判斷是否存在負權迴路。

我們用陣列dis記錄每個結點的最短路徑估計值,可以用鄰接矩陣或鄰接表來儲存圖g,推薦使用鄰接表。

spfa的演算法思想(動態逼近法):

設立乙個先進先出的佇列q用來儲存待優化的結點,優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛操作,直至佇列空為止。 

鬆弛操作的原理是著名的定理:「三角形兩邊之和大於第三邊」,在資訊學中我們叫它三角不等式。所謂對結點i,j進行鬆弛,就是判定是否dis[j]>dis[i]+w[i,j],如果該式成立則將dis[j]減小到dis[i]+w[i,j],否則不動。 

下面舉乙個例項來說明sffa演算法是怎樣進行的:

code:

#include#includeusing namespace std;

int n, m, st;

#define mm 500005

#define mn 10005

#define inf 99999999

#define iinf 2147483647

struct edgedge[mm];

int head[mn];

int dis[mn];

queueq;

bool used[mn];

void spfa()

}} }

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

int main()

; head[u] = i;

} spfa();

return 0;

}

最短路SPFA演算法(解決負權邊)

演算法思想 實現方法 建立乙個佇列,初始時佇列裡只有起始點,再建立乙個 記錄起始點到所有點的最短路徑 該 的初始值要賦為極大值,該點到他本身的路徑賦為0 然後執行鬆弛操作,用佇列裡有的點作為起始點去重新整理到所有點的最短路,如果重新整理成功且被重新整理點不在佇列中則把該點加入到佇列最後。重複執行直到...

單源最短路徑 SPFA演算法

求單源最短路徑的spfa演算法在bellman ford演算法的基礎上進行了改進,使其在能夠計算帶負權圖的單源最短路徑的基礎上,時間複雜度大幅度降低。時間複雜度 o k e k 2 基本演算法 設立乙個先進先出的佇列來儲存待優化的節點,優化時每次取出隊首節點u,並且用u點當前的最短路徑估計值對離開u...

Spfa單源最短路徑演算法

spfa 全稱shortest path faster algorithm,是求單源最短路徑的一種演算法.跟dijkstra類似,但是有一些不一樣。由於本人弱,不知道 有區別,請各位大神補充 我們來建乙個圖。首先,我們用e陣列表示各邊的關係,如下是初始狀態。我們開乙個dis陣列來儲存1號點到各點的最...