最短路徑 SPFA演算法

2021-10-03 05:54:04 字數 1004 閱讀 1204

其實也是運用了動態規劃的思想,借助於佇列來實現求解最短路徑。

其思想過程與floyd演算法有點相似,但是spfa演算法可以解決負權邊的問題。

我們用陣列dis記錄每個結點的最短路徑值(在目前步驟時),可以用鄰接矩陣或鄰接表來儲存圖g。

設立乙個先進先出的佇列q(c++的建議使用stl)用來儲存待處理的結點,將源點放入。每次處理佇列首元素u點,並且用u點當前的u點最短路徑值對離開u點所指向的結點v進行鬆弛操作(即從原點到u點然後到v點的路徑,判定是否dis[j]>dis[i]+map[i][j],如果該式成立則將dis[j]減小到dis[i]+w[i][j],否則不動),如果v點的最短路徑值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛操作,直至佇列空為止。

詳細過程見分享部落格:傳送門

例題:

最短路徑演算法 SPFA

求最短路徑的演算法有許多種,除了排序外,恐怕是oi界中解決同一類問題演算法最多的了。最熟悉的無疑是dijkstra,接著是bellman ford,它們都可以求出由乙個源點向其他各點的最短路徑 如果我們想要求出每一對頂點之間的最短路徑的話,還可以用floyd warshall。spfa是這篇日誌要寫...

SPFA演算法 最短路徑

只要最短路徑存在,spfa演算法必定能求出最小值,spfa對bellman ford演算法優化的關鍵之處在於意識到 只有那些在前一遍鬆弛中改變了距離估計值的點,才可能引起他們的鄰接點的距離估計值的改變。為什麼隊列為空就不改變了呢?就是因為要到下一點必須經過它的前乙個鄰接點。spfa可以處理負權邊。很...

SPFA演算法 最短路徑

spfa是一種求單源最短路的演算法 演算法中需要用到的主要變數 int n 表示n個點,從1到n標號 int s,t s為源點,t為終點 int d n d i 表示源點s到點i的最短路 int p n 記錄路徑 或者說記錄前驅 queue q 乙個佇列,用stl實現,當然可有手打佇列,無所謂 bo...