Spfa演算法 最短路徑問題

2022-08-21 16:27:16 字數 1151 閱讀 5339

spfa原理

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

´spfa演算法實際上是對於bellman-ford演算法的乙個使用佇列的優化。

´我們不再同時對m條邊進行鬆弛,而是選擇將每次鬆弛後的到達的點加入佇列(如果已經在 佇列就可以忽略),然後再去鬆弛由這個點連出去的邊

´對於負環的判斷,實際上只需要出現某乙個點進入佇列n次,就可以知道出現了負環。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7using

namespace

std;

8#define uint unsigned int

9#define ll long long

10#define ull unsigned ll

11#define pii pair12

#define pb push_back

13#define mp make_pair

14#define inf 2147483647

15#define linf 9999999999

16#define ms(l) memset(l,0,sizeof(l))

1718

uint

n,m,spoint;

19uint dis[10001

];20

class

edge;

24 vectordata[10000

];25

26void addedge(uint fr,uint to,uint

co)31

32void spfa(void)49

}50}51

}52intmain()

60spfa();

61for(uint i = 1;i <= n;i++)

62 cout << dis[i] << '';

63 cout <64return0;

65 }

推薦:

最短路徑演算法 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...