关于弗洛伊德算法的思考(C++)

Floyd弗洛伊德算法是解决多起点多终点最短路径距离的经典算法,其代码十分简洁(咱就是说确实很好突击记忆),主要是一个三层for循环,循环里的操作语句只有一条,就是更新最短距离,最短距离用一个邻接矩阵存储。时间复杂度为O(n^3),因此适用于n不太大时,一般小于200.

现在我们思考一下,为什么通过循环n次使得以每个点都作一次中间点,就能得到全局最优呢?也就是有没有可能出现一种情况:循环前面的以某个点为中间点优化后,循环后的某个点在某条路径上还要以该点为中间点才能得到优化?说实话,这个思考方式有点乱了。我们先来捋一捋,我们现在有什么条件,初始时,最短路径距离的邻接矩阵存的是两点直接相连的路径的距离,而我们要求的是两点直接或间接相连的路径的距离。也就是如果是间接相连路径更短,则在这两点之间,必存在使其最短距离更优的中间点,这意味着什么呢,我们通过起点到中间点的距离+中间点到终点的距离这个值和两点原来的距离比较一下,就能得到更优的了。但是问题是,我们要求的两点的最短距离只要是相连就行啊,两点之间不一定只有一个中间点,可能最优路径上有n-2个中间点呢?那么通过前面的但中间点情况还可以推导过来吗?这两者之间有什么隐含的关系呢?

先从简单的情况思考一下,现在,我们假设源点s和目的点t之间的最优路径上有两个中间点m1,m2,这意味着什么呢?

总结一下:上述推理中有两个要点:

1.以全图n个中间点更新一次最短距离,不管n个中间点选取先后顺序如何,只要取过,就可以保证最终求出指定两点s到t的最短距离;

2.以全图n个中间点更新一次最短距离,可以保证任意两点的中间点都选取更新过。

感觉还是说的有点乱,思考一下,弗洛伊德算法的本质思想是什么呢?

其实就是已知任意两点的最短路径上的中间点个数为0~n-2(不包含这两点),把n个点都选取作为一次中间点,那么就可以将全图任意两点的最短路径(此处指的是距离)求解出来。

最后提炼两点:

1.假设两点最短路径上中间点已知,只要选取过这些点更新,不管选取次序如何,都可以得到这两点的最短路径

2.最后一次以某中间点更新两点间最短路径时,起点到中间点和中间点到起点的最短路径间都不可能包含需要由中间点更新的最短路径,否则,这两点的最短路径就不需要看需要中间点为子最短路径中间点更新距离的m2这个中间点了,如图。即:既然说某个点是某两点间最短路径上的中间点,那这个点只可能出现一次,不可能在路径上出现两次。也就是中间点在两点间一步到位。

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值