最短路(3) floyd和用floyd求最小環

2021-08-01 01:29:56 字數 1392 閱讀 3076

先介紹floyd演算法,這種演算法可以用來求圖中任意兩點間的最短路

思路:下面是整個程式的**

//floyd

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1000 + 10;

const

int inf = 0x3f3f3f3f;

int d[maxn][maxn];

int n, m;

int main()

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

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

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

if(d[i][k] < inf && d[k][j] < inf)

d[i][j] = min(d[i][j], d[i][k] + d[k][j]);

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

return

0;}

思路:

如果我們要求包含點i, j的最小環,在已經算出來i, j之間的最短路d[i][j]的情況下(假設他們之間是經過點k中轉的),還需要計算有j到i且不經過點k的最短路

我們令k為這個最小環裡的最大編號的點,則在前面計算d[i][j]時,一定沒有經過點k,所以當第一層迴圈迴圈到k時,列舉所有小於k的點對,計算d[i][j] + m[j][k] + m[k][i],更新最小環的值

*把上面的程式放在正常求floyd時遍歷i,j迴圈的前面*

//floyd求最小環 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1000 + 10;

const

int inf = 0x3f3f3f3f;

int d[maxn][maxn];

intmap[maxn][maxn]; //兩點之間的距離,這個陣列是固定的,不會更新

int n, m;

int main()

int ans = inf;

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

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

//

cout

<< ans;

return

0;}

最短路徑(Dijkstra和Floyd)

floyd演算法 有點類似dp的思想 floyd 弗洛伊德 演算法的基本思想是 對乙個頂點個數為n的有向網 或無向網 設定乙個n n的方陣a,其中除對角線的矩陣元素都等於外,其他元素a k i j i j 表示從頂點vi到頂點vj的有向路徑長度.時間複雜度為o n 3 int edge m m 鄰接...

最短路徑 Dijkstra演算法和Floyd演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...

最短路徑 Dijkstra演算法和Floyd演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...