我正在考虑在有向图中找到负重量循环的算法。问题是:我们有一个图G(V,E),我们需要找到一个有效的算法来找到负权重的循环。 I understand the algorithm in this PDF document负重量循环算法
简而言之,该算法通过迭代| V | -1次来应用贝尔曼福特算法来做放松。之后,它检查是否存在可以更放松的边缘,然后存在负的权重循环,并且可以通过父指针追踪它,并且一切都很顺利,我们会发现一个负的权重循环。
但是,我正在考虑另一种算法,通过跟踪迄今为止穿过的距离的总和,在图上使用深度优先搜索(DFS),我将所有节点标记为白色,并使它们变为白色当我搜索路径时是灰色的,并且在完成时将它们标记为黑色,这样我就知道当且仅当找到访问节点并且它是灰色的(在我的路径中)而不是黑色的时候,我已经找到了一个循环由深度优先搜索完成,对于我的算法,如果我到达已经访问过的灰色节点,我检查它会更新的是什么(新距离),如果它低于以前,我知道我有一个负重量循环,可以追溯到它。
我的算法错了吗?如果是这样,你能找到一个反例吗?如果不是,你能帮我证明吗?
谢谢你
为了找到一个-ve循环,像这样的算法必须遍历它。我怀疑,在一张大图中,有很多可能的周期。在具有N个节点的完全连通图中,将有第N个/ N个周期从第一个节点开始并依次访问每个其他节点。所以我认为你的算法要么比Bellman-Ford要花费更长的时间,要么在某些图表中错过一些周期。 – mcdowella 2011-04-04 04:32:20
你是否从每个节点做dfs?如果不是,你开始搜索什么节点? – 2011-04-04 04:34:03
我的dfs遍历了所有的节点,当它被卡住时,它找到另一个0度入度的节点,并再次执行dfs。总的来说,我的DFS应该运行在O(V + E)时间(线性) – 2011-04-04 04:35:35