1. 程式人生 > 實用技巧 >Floyd演算法學習筆記

Floyd演算法學習筆記

身為一頭剛學圖論的蒟蒻,瞎搗鼓了好幾天,終於學會了四種最短路演算法!(^-^)V
本博文程式碼存圖除了Bellman_Ford和Floyd都是由vector存的,連結串列前向星黨請移步/kk。
本文將會帶你瞭解floyd!
總的來說,Floyd大約長草
Floyd是一種求全源最短路徑,時間複雜度為 \(O(N^3)\) ,空間複雜度為 \(O(N^2)\)
一般來說Floyd用權矩陣存圖。
在求單源最短路徑中,無論是空間還是時間花費較大,十分不值得。可是在求任意兩點的最短路中,得到了非常廣泛的應用。
本質上Floyd其實是個DP,實際上ta最是暴力((*/ω\*)
Floyd的工作原理是:
第一層迴圈列舉中轉點,第二層迴圈第三層迴圈列舉起點和重點。
狀態就是邊權,沒啥好說的。
最短路的狀態轉移方程則是:
$ gra[i][j]=gra[i][k]+gra[k][j]; $
(k為中轉點,i、j為起點和終點)

現在來一起看看程式碼吧!

#include<iostream>
#include<cstring>
#define INF 99999999 
#define MAXN 1000
using namespace std;
int gra[MAXN][MAXN];//權矩陣 
int main()
{
	for(int p=1;p<=MAXN;p++)
    	for(int i=1;i<=MAXN;i++)
    		if(p==i)gra[p][i]=0;
    		else gra[p][i]=INF;
    int n,m,a,b;
    cin>>n>>m>>a>>b;
    for(int p=1,x,y,z;p<=m;p++)
    {
        cin>>x>>y>>z;//輸入行,列,邊權 
        gra[x][y]=z;
    }
    //下面是經典的Floyd
    for(int k=1;k<=n;k++)  
    	for(int i=1;i<=n;i++)  
    		for(int j=1;j<=n;j++)  
    			if(gra[i][j]>gra[i][k]+gra[k][j] )   
	    			gra[i][j]=gra[i][k]+gra[k][j];  
    cout<<gra[a][b]<<endl;
}