弗洛伊德算法

弗洛伊德算法的原理是动态规划
设D[i][j][k]为从i到j只以1-k中的结点为中间结点的最短路径长度,则
(1)如果最短距离经过点k,那么D[i][j][k] = D[i][k][k - 1] + D[k][j][k - 1]
(2)如果不经过点k,那么D[i][j][k] = D[i][j][k - 1]
因此,D[i][j][k] = Min(D[i][k][k - 1] + D[k][j][k - 1], D[i][j][k - 1])
显然,把k放在最外层的循环,即可省略第三维
下面代码的结点如图:

#include <iostream>
using namespace std;

const int MaxN = 100, INF = 1000000000;
int N, g[MaxN][MaxN];

int Min(int a, int b)
{
	return a < b ? a : b;
}

void floyd()
{
	for (int k = 0; k < N; k++)
	{
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				g[i][j] = Min(g[i][k] + g[k][j], g[i][j]);
			}
		}
	}
} 

int main()
{
	N = 5;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (i != j)
			{
				g[i][j] = INF;
			}
		}
	}
	g[0][1] = g[1][0] = 3;
	g[0][2] = g[2][0] = 2;
	g[0][4] = g[4][0] = 12;
	g[1][2] = g[2][1] = 6;
	g[2][3] = g[3][2] = 5;
	g[3][4] = g[4][3] = 4;
	floyd();
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cout<<g[i][j]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
}
运行结果如图:

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务