首页 > 编程语言 >Floyd算法

Floyd算法

时间:2024-04-22 17:37:21浏览次数:14  
标签:int Floyd 短路 算法 ar fl 105

多源最短路算法,可计算任意点对之间的最短路长度,时间复杂度\(O(n^3)\)
Floyd算法思想十分简单,用\(d[i][j]\)表示\(i\)和\(j\)节点之间的最短路,其核心代码如下:

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

遍历\(k\)、\(j\)、\(i\)更新即可。

题目参考:洛谷:P6464
题解:遍历传送门,然后更新所有以传送门为中继点的最短路选择
代码参考:

#include <bits/stdc++.h>
using namespace std;
int ar[105][105];
int fl[105][105];
int n, m, ans = 2e9;
inline void reset()
{
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			fl[i][j] = ar[i][j];
}
int main()
{
	cin >> n >> m;
	memset(ar, -1, sizeof(ar));
	for (int i = 1; i <= m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		ar[u][v] = w;
		ar[v][u] = w;
	}
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				if (ar[i][k] != -1 && ar[k][j] != -1)
					if (ar[i][j] == -1 || ar[i][j] > ar[i][k] + ar[k][j])
						ar[i][j] = ar[i][k] + ar[k][j];
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			reset();
			fl[i][j] = fl[j][i] = 0;
			for (int x = 1; x <= n; x++)
				for (int y = 1; y <= n; y++)
					if (fl[x][y] == -1 || fl[x][y] > fl[x][i] + fl[i][y])
						fl[x][y] = fl[x][i] + fl[i][y];
			for (int x = 1; x <= n; x++)
				for (int y = 1; y <= n; y++)
					if (fl[x][y] == -1 || fl[x][y] > fl[x][j] + fl[j][y])
						fl[x][y] = fl[x][j] + fl[j][y];
			int res = 0;
			for (int x = 1; x <= n; x++)
				for (int y = 1; y < x; y++)
					res += fl[x][y];
			ans = min(ans, res);
		}
	}
	printf("%d\n", ans);
	return 0;
}

标签:int,Floyd,短路,算法,ar,fl,105
From: https://www.cnblogs.com/Cnoized/p/18151039

相关文章