身爲一頭剛學圖論的蒟蒻,瞎搗鼓了好幾天,終於學會了四種最短路算法!(^-^)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爲起點和終點)ios
如今來一塊兒看看代碼吧!算法
#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; }