弗洛伊德算法

弗洛伊德算法的原理是动态规划
设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;
}
运行结果如图:

全部评论

相关推荐

07-09 19:25
门头沟学院 Java
这是要把每一个投校招的都开盒吗?
26届之耻将大局逆转:裁人的时候一次性追回餐费
点赞 评论 收藏
分享
不亏是提前批,神仙打架,鼠鼠不配了
站队站对牛:现在92都报工艺岗了
投递韶音科技等公司7个岗位
点赞 评论 收藏
分享
05-22 12:44
已编辑
门头沟学院 golang
点赞 评论 收藏
分享
下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务