佛洛依德算法求最短路径(记录路径信息)

佛洛依德算法:
利用D矩阵拿到邻接矩阵中的权值。path矩阵记录两点之间的移动中转点(初始值为起点)。
对于邻接矩阵中 i 到 j 点的权值进行比较,若加上一个中转点 k 后的权值小于原本的权值,则对D[i][j]改为较小的D[i][k] + D[k]+[j]
而更新之后,路径则是从i–j改为i–k--j,所以path[i][j] = path[k][j];
若要输出 i到 j的路径,要循环输出path对应位置的值.
注意,当路径变长时,path矩阵存储的值需要倒序输出才行,
举个例子:
有五个点abcde ,对应坐标分别为01234
其中顶点的连接关系为 a-b b-c c-d d-e a-e
由于三重循环先后顺序的缘故,path[0][4]的中转点为3
而path[0][3]的中转点为2
path[0][2]的中转点为1。。。直到最后为0本身
在这里插入图片描述
所以当顶点数量多时,个人认为需要倒序输出path中记录的路径信息

算法代码:

//图中任意结点间最短路径的算法(佛洛依德算法)
void Floyd(Graph g) {
   
	int path[vexNum][vexNum];		//记录最短路径经过结点的信息
	int D[vexNum][vexNum];			//记录最短路径的长度
	for(int i=0;i<g.vexnum;i++)
		for (int j =
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值