在带有一组禁止节点的两个节点之间寻找最短路径

时间:2018-12-05 16:16:33

标签: algorithm graph shortest-path

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

enter image description here

4 个答案:

答案 0 :(得分:1)

  • 从头开始创建BFS,不要越过禁止的节点。
  • 使BFS从头开始,不要越过禁止的节点。
  • 将路径距离初始化为dist(start,end)。如果您的第一个bfs尚未结束,这将是无限的。
  • 对于每个禁止节点,请执行路径距离= min(路径距离,dist(开始,禁止节点)+ dist(结束,禁止节点))
  • 返回路径距离

复杂度:与BFS相同

答案 1 :(得分:1)

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

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

  3. 对于所有禁止的节点,请选择距离最小的距离,从距离起始的距离到距离结束的距离。 (请注意,此节点可能不存在,因为节点在这些字段中可以具有无效值,因此应取消考虑)

  4. 从头到尾进行一次BFS,排除所有禁止的节点(在(3)中找到的除外)。

  5. 在4次执行的BFS中,您将:

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

答案 2 :(得分:0)

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

您要从末端节点进行同样的操作,在路径上给出距离2和1。

然后取消禁止最佳禁止节点(到起点的最小距离+到终点的距离)。最后,您将在整个图中执行BFS。

您最终可以将路径保存到所有禁止的节点,以保存最后的BFS。

答案 3 :(得分:0)

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

实际上,如果您将禁止节点列表作为图结构的一部分,则删除操作可能是一次简单的迭代。