適用範圍:給定的圖存在負權邊,這時類似dijkstra等演算法便沒有了用武之地,而bellman-ford演算法的複雜度又過高,spfa演算法便派上用場了。 我們約定有向加權圖g不存在負權迴路,即最短路徑一定存在。當然,我們可以在執行該演算法前做一次拓撲排序,以判斷是否存在負權迴路,但這不是我們討論的重點。
主要思路:現將圖用鄰接表edges[mxan]來儲存,(當然鄰接矩陣也可以),然後進行spfa操作,用dis[maxm]陣列來記錄源點到其他點的最短路,用vis[maxm]陣列來標記哪些點已經被走過,用que[maxm]佇列來維護當前要待鬆弛的點,每次取隊首進行操作,由隊首擴充套件出的點依次加入隊尾,如此反覆,直到隊列為空為止。
實現方法:
建立乙個佇列,初始時佇列裡只有起始點,再建立乙個**記錄起始點到所有點的最短路徑(該**的初始值要賦為極大值,該點到他本身的路徑賦為0)。然後執行鬆弛操作,用佇列裡有的點作為起始點去重新整理到所有點的最短路,如果重新整理成功且被重新整理點不在佇列中則把該點加入到佇列最後。重複執行直到隊列為空。
判斷有無負環:
如果某個點進入佇列的次數超過n次則存在負環(spfa無法處理帶負環的圖)
下面貼**:
#include
using namespace std;
#define inf 0x7fffffff
const
int maxn = 100005;
const
int maxm = 5005
<<1;
struct dataedges[maxm];
int first[maxm], dis[maxm], que[maxm], vis[maxm];
int n, m;
void read_edges()
for(int e = 1, u, v, w; e <= m; e++)
}void spfa()
k = edges[k].next; //擴充套件出其他的所有邊 }}
// cout << dis[n] << endl;
}int main()
C 最短路 鄰接表儲存及SPFA演算法
c 最短路 time limit 7000ms memory limit 65536kb problem description 給出乙個帶權無向圖,包含n個點,m條邊。求出s,e的最短路。保證最短路存在。input 多組輸入。對於每組資料。第一行輸入n,m 1 n n 5 10 5,1 m m 2...
HDU 2544 最短路 SPFA 鄰接表 模板
problem description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整...
最短路 SPFA演算法
spfa 是bellman ford的佇列優化,時效性相對好,時間複雜度o ke 與bellman ford演算法類似,spfa演算法採用一系列的鬆弛操作以得到從某乙個節點出發到達圖中其它所有節點的最短路徑。所不同的是,spfa演算法通過維護乙個佇列,使得乙個節點的當前最短路徑被更新之後沒有必要立刻...