我在考虑在有向图中找到负权重循环的算法。问题是:我们有一个图G(V,E),我们需要找到一个有效的算法来找到负权重的循环。 I understand the algorithm in this PDF document
简而言之,该算法通过迭代| V | -1次进行松弛来应用Bellman Ford算法。然后它会检查是否有一个可以放松的边缘,然后存在一个负的重量周期,我们可以通过父指针追溯它,一切顺利,我们发现负重量周期。
然而,我正在考虑另一种在图上使用深度优先搜索(DFS)的算法,通过跟踪到达距离的总和到目前为止,我在开始时将所有节点标记为白色并使它们变为灰色当我在搜索路径时,并在它们完成时将它们标记为黑色,这样我知道我找到一个循环当且仅当我找到一个被访问的节点并且它是灰色的(在我的路径中),而不是黑色已经完成通过深度优先搜索,对我的算法来说,如果我到达一个已经被访问过的灰色节点,我会检查它的更新是什么(新的距离),如果它比以前低,我知道我有负重量循环并且可以追溯它。
我的算法错了吗?如果是这样,你能找到一个反例吗?如果没有,你能帮我证明吗?
谢谢
答案 0 :(得分:16)
Bellman Ford并不总是有效,问题是它是一个单源最短路径算法,如果从您选择的源无法获得负循环,它就会失败。然而,贝尔曼福特的一点改变可能会有所帮助,而不是选择一个源顶点并将其距离初始化为0,我们可以将所有距离初始化为0,然后运行Bellman Ford。这相当于添加一个额外的顶点s',它指向原始图中具有0个权重边的所有顶点。一旦Bellman Ford在图上运行,我们发现任何顶点u和edge(u,v)使得d [u] + w [u] [v]< d [v],我们知道必须有一个导致你的负循环,在前一个图中跟踪你,我们会找到循环。
DFS不会以任何方式工作,显然无法耗尽所有可能的周期。 DFS可用于在图表中查找周期的存在,但不能再用。
答案 1 :(得分:3)
一个明显的问题是,您正在标记节点。
A <---> B
| ^
\--\ |
v
-> D (crap ascii art, A connects to D unidirectionally)
假设你选择路径A-> B-> D,当你点击D时,A B D是灰色的。没有找到循环。你弹出A; B和D是黑色的。你走边缘,没有找到周期,因为D是黑色。
通常,路径数量与图形的大小成指数关系。你必须尝试每条路径,这里没有办法标记节点。如果你分别处理有向图中的每个边方向,我相信你能够做到这一点标记边,但是,这相当于枚举所有路径。
答案 2 :(得分:-1)
我相信有一种方法可以在线性时间内解决这个问题。 在使用深度优先搜索(DFS的运行时间为O(V + E))搜索图形时,您可以跟踪从源到当前节点的距离(通过简单地增加父节点的距离与父节点的权重)将子节点连接到父节点的边缘。 然后,每当遇到一个循环(通过在无向图中找到后边缘或在有向图中的后边缘或前边缘中发现周期),您可以减去源之间的距离节点和循环的根节点从源节点和循环中的最终节点之间的距离(根节点是循环开始的节点)。 如果结果为负,则周期必须为负!
答案 3 :(得分:-1)
Yamada/Kinoshitas 算法 解决了使用最大值的上限在有向加权图中找到所有负加权环的问题- 检测到的循环的顶点数。
不过实施起来颇具挑战性。
<块引用>摘要
给定一个有向图,其中边与权重相关联 不一定是积极的,我们关心的是 找到所有具有负总权重的基本循环。 找到所有基本循环的算法,或检测,如果一个 存在,这样的图中的负循环得到了很好的探索。然而, 找到所有具有负成本的基本循环似乎是 未开发。我们开发了一种算法来做到这一点基于 “分而治之”范式,并评估其在某些方面的表现 数值实验。
从 2002 年 5 月 离散应用数学 118(3):279-291 https://www.researchgate.net/publication/220570430_Finding_all_the_negative_cycles_in_a_directed_graph