循环有向图中的最短路径

时间:2009-04-25 15:55:42

标签: path short

我需要一个节点的有向图循环的最短路径的例子(它应该从阳极到达所有节点的节点将是输入)请如果有一个例子我需要它在c ++或算法非常感谢.........

2 个答案:

答案 0 :(得分:1)

您需要找到minimum spanning tree

对于根据维基百科的有向图,您可以使用this算法。

答案 1 :(得分:1)

在伪代码中:

//INPUT: graph G = (V,E)
//OUTPUT: shortest cycle length
min_cycle(G)
  min = ∞
  for u in V
    len = dij_cyc(G,u)
    if min > len
      min = len
  return min    

//INPUT: graph G and vertex s
//OUTPUT: minimum distance back to s
dij_cyc(G,s)
  for u in V
    dist(u) = ∞
                   //makequeue returns a priority queue of all V
  H = makequeue(V) //using dist-values as keys with s First In
  while !H.empty?
    u = deletemin(H)
    for all edges (u,v) in E
      if dist(v) > dist(u) + l(u,v) then
        dist(v) = dist(u) + l(u,v)
        decreasekey(H,v)

  return dist(s)

这在每个顶点上运行稍微不同的Dijkstra。突变的Dijkstras 有一些关键的区别。首先,所有初始距离都设置为∞,即使是 开始顶点。其次,必须先将起始顶点放在队列中才能生成 确保它首先出现,因为它们都具有相同的优先级。最后, mutated Dijkstras返回返回起始节点的距离。如果没有 路径返回起始顶点距离保持∞。所有这些中的最小值 从变异的Dijkstras返回是最短的路径。自Dijkstras运行 最糟糕的是在O(| V | ^ 2)和min_cycle运行这种形式的Dijkstras | V |时代, 找到最短周期的最终运行时间是O(| V | ^ 3)。如果min_cyc返回 ∞那么图是非循环的。

要返回最短周期的实际路径,只需稍作修改即可。