最短路径算法—Floyd(弗洛伊德)算法

本文详细介绍Floyd算法,一种用于求解任意两点间最短路径的经典动态规划算法。文章阐述了算法的时间复杂度O(N^3)及空间复杂度O(N^2),并通过实例解释了如何通过迭代更新顶点间的距离来寻找最短路径。
摘要由CSDN通过智能技术生成

Floyd算法(解决任意两点间的最短路径,可以正确处理有向图或负权值的最短路径问题):

时间复杂度O(N3),空间复杂度O(N2);

算法思想:

Floyd算法是一个经典的动态规划算法;首先我们的目标是计算顶点i到j的最短路径,从动态规划角度来看:

从节点i到节点j的最短路径不外乎两种可能:1)直接从i到j; 2) i经过若干节点再到j;所以我们可以这样来计算i j之间的最短距离:对于每一个结点k,我们判断Dist(i,k)+Dist(k,j)<Dist(i,j)是否成立,如果成立,则证明从i到k,再从k到j的距离比直接从i到j的距离短,所以我们更新Dist(i,j)=Dist(i,k)+Dist(k,j); 这样,遍历完所有的k值,则得到最终从i到j的最小距离。

Floyd算法过程:

1、用D[i][j]记录每两个顶点之间的距离;

2、依次扫描每一个顶点k,以该点为基准,判断从i经过k,再到j的距离是否小于D[i][j],若是则更新D[i][j]=D[i][k]+D[k][j];

精髓:依次扫描每一点(k),并以该点作为中介点,计算出通过k点的其他任意两点(i,j)的最短距离,这就是floyd算法的精髓!同时也解释了为什么k点这个中介点要放在最外层循环的原因.

typedef struct
{
	char vertex[MAXVER];
	int edges[MAXVER][MAXVER];
	int n, e;
}MGraph;
void Floyd(MGraph g)
{
	int D[MAXVER][MAXVER];
	int path[MAXVER][MAXVER];
	int n = g.n;
	for (int i = 0; i < n; ++i) //初始化
	{
		for (int j = 0; j < n; ++j)
		{
			D[i][j] = g.edges[i][j];
			path[i][j] = -1;
		}
	}
	for (int k = 0; k < n; k++) //注意:一定要理解为什么把k放在最外层的循环,而不放在最内层!!
	{
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				if (D[i][j]>D[i][k] + D[k][j])
				{
					D[i][j] = D[i][k] + D[k][j];
					path[i][j] = k;
				}
			}
		}
	}
}



弗洛伊德最短路径算法是一种用于求解带权有向图中任意一对顶点间最短路径算法。该算法的时间复度为O(n^3),相对于迪杰斯特拉算法来说,弗洛伊德算法的形式更为简单。 弗洛伊德算法的基本思想是通过一个三重循环,依次考察每个顶点作为中间节点的情况,更新每一对顶点间的最短路径长度。具体步骤如下: 1. 读入一个有向图的带权邻接矩阵,建立有向图。 2. 初始化一个二维数组d,用于存储每一对顶点间的最短路径长度。将邻接矩阵复制给d。 3. 通过一个三重循环,依次考察每个顶点作为中间节点的情况。假设当前中间节点为k,对于每一对顶点i和j,比较d[i][k] + d[k][j]与d[i][j]的大小,将较小值更新为d[i][j]。 4. 继续进行第3步,直到所有的顶点都被考察为中间节点,即完成了所有顶点间的最短路径计算。 5. 输出最终的d数组,即为每一对顶点间的最短路径长度。 需要注意的是,在计算最短路径的过程中,可以将每个顶点是否可达记录下来,以便后续判断是否存在从源点至相应顶点的路径。如果不存在路径,则输出-1。对于某个顶点到其本身的最短路径长度,输出0。 在题目描述中,输入的第一行为正整数n,表示图中共有n个顶点。接下来的n行为n个用空格隔开的整数,表示带权邻接矩阵。输出为n行n个整数,表示源点至每一个顶点的最短路径长度。 参考资料: [1] 引用[1] [2] 引用[2] [3] 引用[3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值