利用弗洛伊德算法求某一顶点到其余各顶点的最短路径

本文介绍了弗洛伊德算法在求解图中任意两点间最短路径的应用,详细阐述了算法的步骤、伪代码以及Path矩阵分析。通过三重循环实现,其时间复杂度为O(n^3)。

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

      虽然能用迪杰斯特拉算法求出图中某一个顶点到其余各个顶点的最短路径,但是如果求图中任意一对顶点间的最短路径,通常用弗洛伊德算法求解。

【弗洛伊德算法求解最短路径的一般过程】、

      第一步,这是两个矩阵A和Path,初始时将图的邻接矩阵赋值给A,将矩阵Path中元素全部设置为-1。

      第二步,以顶点k为中间顶点,k取0-n-1(n为图中顶点个数),对图中所有顶点对{i,j}进行如下检测与修改:

如果A[i][j] > A[i][k] + A[k][j],则将A[i][j]修改为A[i][k] + A[k][j]的值,将Path[i][j]的值改为k,否则什么都不做。

【弗洛伊德算法伪代码——参考自《数据结构高分笔记》】

public void Floyd(MGraph g,int A[][maxsize],int Path[][maxsize]){
	for(int i=0;i<g.n;++i){		//这个双重循环实现对数组A和Path初始化赋值
		for(int j=0;j<g.n;++j){
			A[i][j] = g.edges[i][j];
			Path[i][j] = -1;
		}
	}

	for(int k=0;k<g.n;++k){		//这个三重循环完成了以k为中间点对所有的定点对<i,j>进行检测和修改
		for(int i=0;i<g.n;++i){
			for(int j=0;j<g.n;++j){		//循环以行优先遍历矩阵
				if(A[i][j] > A[i][k]+A[k][j]){
					A[i][j] = A[i][k]+A[k][j];
					Path[i][j] = k;
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值