【问题标题】:How do I find the shortest path that covers all nodes in a directed cyclic graph?如何找到覆盖有向循环图中所有节点的最短路径?
【发布时间】:2009-04-25 15:36:40
【问题描述】:

我需要一个节点的有向循环图的最短路径示例 (它应该从将作为输入的节点到达图形的所有节点)。

如果有例子,我需要C++,或者算法。

【问题讨论】:

    标签: c++ algorithm graph-theory cycle shortest-path


    【解决方案1】:

    编辑:糟糕,误读了这个问题。感谢@jfclavette 接受这个。旧答案在最后。

    您要解决的问题称为Travelling salesman problempotential solutions 有很多,但它是 NP 完全的,所以你无法解决大图。

    旧答案:

    您要查找的内容称为图形的girth。它可以通过将节点到自身的距离设置为无穷大并使用Floyd-Warshall 算法来解决。节点 i 的最短循环长度就是位置 ii 的入口。

    【讨论】:

    • 他想找到访问所有节点的最短路径,而不是返回原始的最短循环。至少这是我从问题中理解的。
    • 这可能不完全是旅行商问题,因为似乎对节点仅访问一次的问题没有限制。所以这个问题不需要图有哈密顿圈。
    • 另外,旅行商问题需要连接所有顶点。在上面的问题中,它并没有说明图的所有顶点都连接。
    【解决方案2】:

    在未加权的情况下:Breadth first search。 在加权情况下:Dijkstra's

    【讨论】:

      【解决方案3】:

      在伪代码中:

      //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 将距离返回到起始节点。如果没有 返回到起始顶点的路径距离保持为∞。所有这些中的最小值 从变异的 Dijkstras 返回是最短路径。由于 Dijkstras 运行 最坏的情况是 O(|V|^2) 和 min_cycle 运行这种形式的 Dijkstras |V|时代周刊 找到最短周期的最终运行时间是 O(|V|^3)。如果 min_cyc 返回 ∞ 则图是非循环的。

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

      【讨论】:

        【解决方案4】:

        对于非加权图,BFS 将完成这项工作。由于您的图中存在潜在的循环,因此您需要跟踪访问过的节点(无论如何,您都需要为 BFS 执行此操作)。

        对于加权图,可以使用 bellman-Ford 算法。它还能够检测周期。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多