單源最短路徑 SPFA演算法

2021-07-03 19:09:45 字數 923 閱讀 6975

求單源最短路徑的spfa演算法在bellman-ford演算法的基礎上進行了改進,使其在能夠計算帶負權圖的單源最短路徑的基礎上,時間複雜度大幅度降低。

時間複雜度   o(k*e)  k<=2

基本演算法:

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

spfa演算法同樣可以判斷負環,如果某個點彈出佇列的次數超過n-1次,則存在負環。對於存在負環的圖,無法計算單源最短路徑。

#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

#define maxn 1010

int n,m,k,a,b,c,s,e;

int map[maxn][maxn],pre[maxn],vis[maxn],dist[maxn],lj[maxn];

void spfa(int s)

dist[s]=0; pre[s]=-1;

memset(vis,0,sizeof(vis));

queueq;

while(!q.empty()) q.pop();

q.push(s);

while(!q.empty())}}

}}int main()

scanf("%d%d",&s,&e);

spfa(s);

printf("%d\n",dist[e]);

}return 0;

}

Spfa單源最短路徑演算法

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

單源最短路徑 SPFA

給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短路徑長...

單源最短路徑之SPFA演算法實現

這裡來簡單介紹下spfa演算法。1 spfa演算法是求解單源最短路徑的,時間複雜度為0 kn 一般k 2。所以該演算法高效。2 以下的 借助stl中的vector,用臨界表來儲存圖的。3 如果要輸出一條最短路徑對應的路線,我們可以用source表來記錄。例如source a b,表示a的前驅為b。這...