使用一组禁止节点查找两个节点之间的最短路径

Finding shortest path between two nodes with a set of forbidden nodes

我有无向和无权图,我想在其中找到两个输入节点之间的最短路径。还有一组禁止节点。如果允许我最多访问 个禁止节点集中的一个节点,如何找到最短路径?

您可以执行第一个 BFS,从一开始就列出可访问的禁止节点(但不能跨越它)。 然后你记录从开始的距离。在您的示例 2 中,每个禁止节点。

你从末端节点开始做同样的事情,在你的路径上给出距离 2 和 1。

然后取消禁止最好的禁止节点(距起点的最小距离+距终点的距离)。你终于在全图中做了一个 BFS。

你最终可以保存到所有禁止节点的路径来保存最后的BFS。

  • 从头做一个 BFS,不要越过禁止节点。
  • 从头做一个BFS,不要越过禁止节点。
  • 初始化路径距离为dist(start, end)。如果您的第一个 bfs 没有结束,这将是无限的。
  • 对于每个禁止节点,路径距离 = min(路径距离, dist(开始, 禁止节点) + dist(结束, 禁止节点))
  • Return路径距离

复杂度:与 BFS 相同

执行 BFS,但将图形作为参数,而不是全局参考 table。在任何分支上,当您访问禁止节点时,您将停止并从传递到下一级的图中删除所有 other 禁止节点。

事实上,如果您将禁止节点列表作为图形结构的一部分,则删除可以是一个微不足道的迭代。

  1. 从 END 开始执行 BFS - 每当它到达禁止节点时,更新其 distance_from_end 并且不要将其邻居添加到您的队列中。所有未访问的禁止节点不应具有有效的 distance_from_end.

  2. 与 (1) 相同,但从 START 开始并更新 distance_from_start

  3. 对于所有被禁止的节点,取具有最小 distance_from_start + distance_from_end 的节点。 (请注意,此节点可能不存在,因为节点在这些字段中可能具有无效值,因此应不予考虑)

  4. 从头到尾做一个BFS,排除除(3)中发现的所有禁止节点。

  5. 根据 4 中执行的 BFS,您将:

    • 找到一条不穿过任何禁止节点的路径,该路径比会穿过它的路径短。
    • 找到一条确实穿过禁止节点的路径,在这种情况下,它的长度应该等于该节点的 (distance_from_start + distance_from_end)。
    • 根本找不到路径,这意味着您在步骤 (3) 中没有找到一个节点,并且在从图中删除所有禁止节点后,您将得到一个 START 和 END 在不同分区中的图。