我试图理解这种算法是如何工作的。
给出一个问题来搜索从源s到图中所有顶点的路径,
我认为我必须按照以下步骤进行:
if no cycle in the graph:
topological sort of the graph
one iteration to calculate the shortest path
else if there is a cycle in the graph:
put s in the queue
v=q.deque
while q is not empty
relax v
我的问题是:
我的诉讼是好还是我必须改变它。
当我必须检查是否有负循环? 谢谢
答案 0 :(得分:2)
您的非循环代码似乎是正确的,但取决于one iteration to calculate the shortest path
的含义。如果图是非循环的(即DAG),那么拓扑排序将允许我们访问每个顶点{{1一次(在检查所有前任之后)并将v
更新到其最小距离。这是在线性时间O(V + E)中完成的。因此,您的DAG算法应该看起来与此类似
dist[v]
对于有向循环图的代码(没有负循环),您不会放松边缘而不更新/检查其端点。我不熟悉BF算法的排队版本。我只能说,只要你意识到它的一个前任(即 DAG_CASE:
topological sort of V
for each u\in V following the topological sorting
for each edge (u,v)
relax(u,v)
)尚未完成,你需要确保顶点v
在队列中。因此,在某些条件下,您的代码应该u
和enqueue
一些顶点(同时放松边缘)。我想你已经知道算法的非排队版本是显而易见的。
当我必须检查是否存在负循环时?
源dequeue
上的BF算法返回从s
到每个其他顶点的最短路径或指示存在负循环的故障。执行后,如果存在未放松的边缘,则存在负循环。
答案 1 :(得分:1)
我不记得贝尔曼 - 福特的细节,但基本上,假设你有n
个边和m
个顶点,
for e = 1 to n-1
iterate tru each vertex and apply the formula
这部分内容可以在互联网上找到。
与When i must check that there is a negative cycle?
相关,你将再做一次迭代,如果最后一个数组中的任何值(n-1-th iteration
之后的数组)发生变化,你会说有负循环,如果没有变化,它会表示没有负循环。
这个youtube link很好地解释了贝尔曼 - 福特的一个例子。