【问题标题】:number of shortest paths between 2 vertex of a graph图的 2 个顶点之间的最短路径数
【发布时间】:2013-09-24 01:18:17
【问题描述】:

1) 任何人都知道在无向无权图中获得最短路径的数量吗? 我想填充一个二维矩阵,其中包含任何 i,j 顶点的最短路径数, 2)另一个问题是如何以路径必须通过某个顶点的方式获得两个顶点 i,j 之间的最短路径数。 提前致谢。

【问题讨论】:

  • 在我上大学的时候,这是我的教授要求我解决的问题。
  • 除非有人对问题提供完整的答案,否则这不是作弊。但更像是旁观者解释解决作业问题的方法。
  • -1:如果人们正在回答您的问题,请仔细阅读这些答案,考虑一下,尝试一下,提出相关问题等,这是有礼貌的。即使人们添加了多个额外的问题,您也可以忽略它们提示...
  • 当然我们朋友的问题是关于无向的所以我认为即使dijkstra也不需要,你可以用bfs处理它,但我不知道的一件事是如果你使用bfs,你想要什么区分以前的路径。任何 cmets?

标签: graph path


【解决方案1】:

让 admat 成为图的邻接矩阵。那么

admat 给出顶点之间长度为 1 的路径;

admat^2 给出顶点之间长度为 2 的路径;

admat^3 给出顶点之间长度为 3 的路径;

发现模式了吗?

【讨论】:

    【解决方案2】:

    Dijkstra http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm 是你的朋友。要找到包含特定节点的最短路径,请应用 Dijkstra 获取从 A 到 B,然后从 B 到 C 的最短路径。它是...

    要获得共享相同成本的路径数量,应该很容易为此修改 Dijkstra,以便为您的家庭作业留下一些东西... :)

    【讨论】:

      【解决方案3】:

      您可以在这种情况下使用 BFS。这是我几年前根据我对一些 AI 课程的记忆编写的算法。我不能确保它完美无缺,但希望它能给你一些提示。

      X(p, d)表示节点X,其父节点为p,与父节点的距离为d

      function findAllShortestPaths(...):
      
      RET = set()
      queue = [S(None, 0)]
      explored = set()
      while queue is not empty:
          Node = queue.dequeue()
      
          if Node is the one we're searching for:
              if Node is not in RET:
                  RET.add(Node)
              else:
                  if Node.d <= d of the node in RET:
                      RET.add(Node)
              continue
      
          if Node is not in explored:
              explored.add(Node)
          else:
              if Node.d <= d of the node in explored:
                  explored.add(Node)
              else:
                  continue
      
          for Child in Node.childrens:
              if Child is not in explored:
                  queue.append(Child(Node, Node.d + 1))
      
          return RET, explored
      

      这是一个例子。假设您有一个 5 点(A、B、C、D、E)图,其线连接如下; AB、BC、CD、DA、EA、EB、EC、ED。您想找到从 A 到 C 的所有最短路径。

      X(parent, distance) ---&gt; Y(...) Z(...) 表示 X 被添加到探索集,Y 和 Z 是 X 的孩子,它们被添加到队列中。

      A(None, 0) ---> B(A, 1) E(A, 1) D(A, 1)
      B(A, 1)    ---> E(B, 2) C(B, 2)
      E(A, 1)    ---> C(E, 2) D(E, 2)
      D(A, 1)    ---> C(D, 2)
      
      [E(B, 2) already in the explored list and the distance is 2 > E(A, 1), continue.]
      
      C(B, 2)    ---> Our GOAL, add to RET
      C(E, 2)    ---> Our GOAL, C already in RET but distance is equal, add to RET
      
      [D(E, 2) already in the explored list and the distance is 2 > D(A, 1), continue.]
      
      C(D, 2)    ---> Our GOAL, C already in RET but distance is equal, add to RET
      

      最后,RET 包含 C(B, 2), C(E, 2), C(D, 2)。从这里并结合探索列表,您可以追溯到源节点。例如,C(B, 2) B(A, 1) A(None, 0)

      可能会有一些错误,但我认为这没什么大不了的。对于第二个问题,一旦我们弄清楚了第一个问题,它就不会太远了。希望对您有所帮助!

      【讨论】:

        【解决方案4】:

        Dijkstra's algorithm 用于查找最短路径。

        注意如果您尝试将它与 shortest path algorithm 搜索一起使用,Google 会首先发现...

        【讨论】:

        • dijkstra 找到了一条最短路径,这没问题。但是例如 2 个顶点之间可能有 3 条最短路径,我只需要知道两个指定顶点之间的最短路径数。
        • 在算法执行期间,您可以跟踪路径何时与到达同一顶点的另一路径具有相同的权重。
        【解决方案5】:

        使用 BFS,我们可以最大限度地降低复杂性。

        使用 BFS 并且我们必须在每一层中保留一个额外的计数器 let Sum(w)。

        让s是起始顶点,我们需要找到到v的最短路径的编号。

        然后让 w 是 L(j-1) 中的一个节点,而 v 在 L(j) 中。

        那么 S(v)= summation{S(w)} + 1;

        和S(v)表示s和v之间的最短路径数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-30
          相关资源
          最近更新 更多