我刚刚开始学习新的算法,但当我读到贝尔曼·福特关于极客的算法时,我陷入了困境:http://www.geeksforgeeks.org/dynamic-programming-set-23-bellman-ford-algorithm/
那里写着-
该算法以自下而上的方式计算最短路径。它首先计算路径中最多有一条边的最短路径的最短距离。然后,它计算最多有2条边的最短路径,依此类推。
在外环第i次迭代后,计算出最多有i条边的最短路径。在任何简单路径中都可能有最大| V |–1条边,这就是为什么外部循环运行| V |–1次。其思想是,假设没有负权重循环,如果我们已经计算出最多有i条边的最短路径,那么对所有边的迭代保证给出最多有(i1)条边的最短路径。
让我们通过下面的示例图来了解算法。这些图像是从这个来源拍摄的。
让给定的源顶点为0。将所有距离初始化为无限,但与源本身的距离除外。图中的顶点总数为5,因此所有边都必须处理4次。
在下面的例子中,如果边的顺序是-(AB),(BE),(ED),(DC),(AC),(BC),(DB),(BD),那么在只有一次迭代中,它将计算具有甚至2-3条边的最短路径,这与“它首先计算最短距离指路径中最多有一条边的最短路径。然后,它计算最多有2条边的最短路径,依此类推。在外循环的第i次迭代之后,计算最多有i条边的最短路径”,因此在改变边的顺序时,这种说法将被证明是错误的。
让我们通过下面的示例图来了解算法。这些图像是从这个来源拍摄的。
让给定的源顶点为0。将所有距离初始化为无限,但与源本身的距离除外。图中的顶点总数为5,因此所有边都必须处理4次。
第一次迭代保证给出所有最短的路径,这些路径最多只有一条边长。当第二次处理所有边时,我们得到以下距离(最后一行显示最终值)。
第二次迭代保证给出最多2条边长的所有最短路径。该算法处理所有边缘2次以上。距离在第二次迭代后最小化,因此第三次和第四次迭代不会更新距离。
使用注释引用的表行
第四行显示何时处理(D,C)、(B,C)和(E,D)。
是不正确的。这意味着存在一条从A
到C
的路径,长度为2,最多包含一条边——然而这样的路径不存在。
那是正确的。放松的顺序并不重要。
有3个节点,所以可以做两次松弛迭代。如果松弛从节点b开始向后发生,然后到节点a,第一次迭代将产生b:无穷大,a: 2。那么第二次迭代是b: 5,a: 2。在第一次迭代中,b不能更新,因为只使用了一条边,所以只能更新距离它一条边的节点a。第二次迭代是当从源到任何地方使用两个边时,所以b最终可以更新。在第一次迭代中,b根本无法更新,因为a还没有准备好。
那么,我们看看正向更新怎么样?在第一次迭代中,它将是a:2和b:5。第二次迭代是a:2和b:5。向前移动可以让所有连续的节点准备好更新的距离,所以更多的迭代不会改变值。但是有人可能会想,如果我对101个节点进行100次迭代,然后进行正向更新,会怎么样。是否有可能在第一次迭代中所有内容都被更新了,并且在第99次迭代之前没有任何更改,并且在第100次迭代时突然有一个节点的距离减小了?不,这是不可能的,因为前向更新不会在第一次迭代后引起更改,除非有一个负循环。
你可以在这里阅读更多关于贝尔曼-福特的信息:https://medium.com/@logicdevildotcom/inetive-编程-应用到图形-f33b6b8a8247
是的,贝尔曼福特的作品无论在哪个顺序的边缘处理。事实上,这就是为什么您必须进行n-1
迭代的原因。如果你知道,什么是边的最佳顺序——只有一次迭代就足够了。
考虑以下图表(所有边都有权重1
):
(1) --> (2) --> (3) --> (4)
如果按1的顺序处理边-
但是,
n-1
迭代是最坏的情况,无论边缘的处理顺序如何(如果没有负循环)。
在一个私人开源项目中,我遇到了以下问题: 有各种各样的任务要执行。其中一些任务将具有 它们必须在一个或多个特定的其他任务之后执行 它们必须在一个或多个特定的其他任务之前执行 我在寻找一个简单的算法,如何利用这些信息构建一个有向图,然后可以用于周期检测,并以一个允许尊重所有这些条件的顺序执行所有任务。 问:什么是构建这样一个图的有效、好的方法? 谢谢你的帮助。 注意:很明显,我们需要在图中增加两个节
问题内容: 假设我有一组任意的纬度和经度对,它们代表一些简单的闭合曲线上的点。在笛卡尔空间中,我可以使用格林定理轻松计算出此类曲线所包围的面积。计算球体表面面积的类似方法是什么?我想我所追求的是Matlabareaint函数背后的算法(甚至是近似算法)。 问题答案: 有几种方法可以做到这一点。 1)整合纬度带的贡献。此处每个条带的面积为(Rcos(A)(B1-B0))(RdA),其中A为纬度,B1
我有一个算法来寻找有向图从一个顶点u到任何其他顶点的边,它具有O(V+E)的时间复杂度(基于DFS)。我必须开发一个算法来找到O(VE)中任意两个顶点u和v之间的边。 你有什么建议或暗示来实现这一点吗? 如果我对每个顶点重复dfs-visite,那么只有第一次顶点是白色的,接下来的调用将不起作用。如果我在做之前重置颜色,那么算法将是O(v^2+VE)。 提前谢谢你!
本文向大家介绍java实现任意矩阵Strassen算法,包括了java实现任意矩阵Strassen算法的使用技巧和注意事项,需要的朋友参考一下 本例输入为两个任意尺寸的矩阵m * n, n * m,输出为两个矩阵的乘积。计算任意尺寸矩阵相乘时,使用了Strassen算法。程序为自编,经过测试,请放心使用。基本算法是: 1.对于方阵(正方形矩阵),找到最大的l, 使得l = 2 ^ k, k为整数并
我有一些困难理解福特-富尔克森算法的最大流量,希望得到一些帮助。 您会注意到节点B和C有一个双向边沿,B-C的容量为8,C-B的容量为3。 现在假设下一条路径是a-c-b-d-f。 我的问题是,我们现在能够通过C-B推动多少流量?是11通过使用8已经推动的流量加上能力3在另一个边缘还是只有3或可能8? 谢谢你抽出时间。
我在传单地图上有一组无组织的点,在我的实现中,这些点表示Minecraftarium.com/map上Minecraftarium.com/map上地图上的领土节点。目前,我的实现只获取点,并使用传单在点周围画一个圆来大致指示控制区域。 然而,这有点难看,也不代表期望的最终结果,即从给定一组数据的边缘点绘制多边形区域。然而,由于这些点的无组织性质,我没有简单的方法来宣布这些点上的“边缘点”,因为它