蒟蒻複習之 Floyd

2021-08-09 04:41:17 字數 1925 閱讀 2960

暴力無解演算法 (入門必備)

//然而我發現這個簡單的演算法還有很多用法

//作為複習篇不講原理

圖的要求:既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環

複雜度為o(n^3)

##原理##

(dp思路)f[i][j] = f[i][k] + f[k][j]

**

void floyd() 

} }}

注意

1應對所建的圖進行初始化如下

void init() 

} }

2輸入時注意判重邊

for(int i = 1; i <= m; i++)
##完整**##

#include#includeusing namespace std;

const int maxn = 1000 + 10;

const int inf = 1<<29;

int n,m;

int f[maxn][maxn];

void init()

} }void floyd()

} }}int main()

floyd();

cout<<"qaq";

return 0;

}

#應用#

##1.傳遞閉包##

判斷圖的連通性

**f[i][j] = f[i][j] || ( f[i][k] && f[k][j] ) **

void floyd() 

} }}

##2.輸出經過k個點後的最短路##

從floyd中dp轉移中可以知道

列舉k個點表示經過k個點後的最短路

void floyd() 

} //此處輸出經過k個點後的最短路

}}

##3.找 i 到 j 最短路的路徑##

新增乙個矩陣p,p[i][j]表示i到j的最短行徑中的j之前的第1個點

void floyd() 

} for(int k = 1; k <= n; k++)

}} }

//列印路徑

for(int i = 1; i <= n; i++)

cout<##4.找最小環##

求圖中的最小環。先考慮無向圖。

floyd演算法保證了最外層迴圈到k的時候所有點對之間的最短路只經過1∼k−1號節點。

環至少有3個節點,設編號最大的為x,與之直接相連的兩個節點為u和v。

環的長度應為f[u][v][x-1]+w[v][x]+w[x][u]。其中w為邊權,如不存在邊則為無窮大。

我們只要在進行第x次迭代之前列舉所有編號小於k的點對更新答案即可。

int ans = inf;

for(int k = 1; k <= n; k++)

}for(int i = 1; i <= n; i++)

}}

##例題##

[luogu 2047]社交網路(統計路徑數)

[luogu 2419]牛大賽cow contest(傳遞閉包)

[codeforces 295b]greg and graph(輸出經過k個點後的最短路)

[poj1734]sightseeing trip(floyd)(最小環+路徑)

蒟蒻複習之 SPFA,dijkstra

蒟蒻複習之 spfa,dijkstra 好把這個太簡單了 作為複習篇不講原理 dijkstra 表示很少用,即使他要比spfa穩定 附贈 模版題 include include include includeusing namespace std const int maxn 500000 100 ...

蒟蒻複習之 Tarjan

蒟蒻複習之 tarjan 強連通圖的判斷方法 作為複習篇不講原理 noip2015 資訊傳遞 就是找乙個最小環 標準的模板題 雖然有很多解法 include include include includeusing namespace std const int maxn 200000 100 in...

蒟蒻複習之 LCA

蒟蒻複習之 lca 這兩年考lca考的特別多,qaq 重要不重要自己體會 1.tarjan 都說tarjan的好寫,一直沒看過 今天看了看挺簡單的,比倍增的好寫多了 個人比較喜歡打多個函式,有點長 模版題 include include includeusing namespace std cons...