Floyd算法的原理和实现

Floyd算法是一种在有向图中求最短路径的算法,适用于包含负权值但不包含负权回路的图。它通过动态规划的思想,以O(N^3)的时间复杂度迭代更新最短路径。在算法运行过程中,根据是否经过点k分为两种情况,最终选择最短路径。在代码实现中,利用path矩阵记录路径信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.算法介绍

Floyd算法是一种在有向图中求最短路径的算法。相比不能再有向图中包含负权值的dijkstra算法,Floyd算法可以用在拥有负权值的有向图中求解最短路径(不过不能包含负权回路)。它是一种求解有向图中点与点之间最短路径的算法。

我们检查有向图中的每一个节点X,对于图中过的2点A和B,如果有Dis(AX)+Dis(XB)<Dis(AB),那么使得Dis(AB)=Dis(AX)+Dis(XB)。当所有的节点X遍历完后,AB的最短路径就求出来了。

所以,核心代码很简单,其中N是顶点个数,时间复杂度为O(N^3)

其中要注意3个for循环的嵌套顺序

void floyd(int N)
{
	int i,j,k;
	for(k=0;k<N;k++)
	{
		for(i=0;i<N;i++)
		{
			for(j=0;j<N;j++)
			{
				if(Dis[i][k]+Dis[k][j]<Dis[i][j])
				{
					Dis[i][j]=Dis[i][k]+Dis[k][j];

				}
			}
		}
	}

}
二.算法的原理

Floyd算法原理是一种动态规划的思想。

Ak(i,j)表示从i点到j点索引号不大于K的最短路径,

则求出最短路径,可表示为

for(K=0;K<N;K++)

然后依次求A0(i,j), A1(i,j), ..., An(i,j) ,其中A0(i,j)表示初始化时候的图

在这个过程中,我们要先求A0(i,j)才能求A1(i,j),再求A2(i,j).....所以这是一种自底向上的设计思想,为什么要先求A0(i,j)才能求A1(i,j),再求A2(i,j)呢.....

因为算法的运行过程是这样的。

我们可以由Ak(i,j)求出Ak-1(i,j),那么对于A

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值