求單源最短路徑的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。這...