使用一组禁止节点查找两个节点之间的最短路径
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 禁止节点。
事实上,如果您将禁止节点列表作为图形结构的一部分,则删除可以是一个微不足道的迭代。
从 END 开始执行 BFS - 每当它到达禁止节点时,更新其 distance_from_end 并且不要将其邻居添加到您的队列中。所有未访问的禁止节点不应具有有效的 distance_from_end.
与 (1) 相同,但从 START 开始并更新 distance_from_start
对于所有被禁止的节点,取具有最小 distance_from_start + distance_from_end 的节点。 (请注意,此节点可能不存在,因为节点在这些字段中可能具有无效值,因此应不予考虑)
从头到尾做一个BFS,排除除(3)中发现的所有禁止节点。
根据 4 中执行的 BFS,您将:
- 找到一条不穿过任何禁止节点的路径,该路径比会穿过它的路径短。
- 找到一条确实穿过禁止节点的路径,在这种情况下,它的长度应该等于该节点的 (distance_from_start + distance_from_end)。
- 根本找不到路径,这意味着您在步骤 (3) 中没有找到一个节点,并且在从图中删除所有禁止节点后,您将得到一个 START 和 END 在不同分区中的图。
我有无向和无权图,我想在其中找到两个输入节点之间的最短路径。还有一组禁止节点。如果允许我最多访问 个禁止节点集中的一个节点,如何找到最短路径?
您可以执行第一个 BFS,从一开始就列出可访问的禁止节点(但不能跨越它)。 然后你记录从开始的距离。在您的示例 2 中,每个禁止节点。
你从末端节点开始做同样的事情,在你的路径上给出距离 2 和 1。
然后取消禁止最好的禁止节点(距起点的最小距离+距终点的距离)。你终于在全图中做了一个 BFS。
你最终可以保存到所有禁止节点的路径来保存最后的BFS。
- 从头做一个 BFS,不要越过禁止节点。
- 从头做一个BFS,不要越过禁止节点。
- 初始化路径距离为dist(start, end)。如果您的第一个 bfs 没有结束,这将是无限的。
- 对于每个禁止节点,路径距离 = min(路径距离, dist(开始, 禁止节点) + dist(结束, 禁止节点))
- Return路径距离
复杂度:与 BFS 相同
执行 BFS,但将图形作为参数,而不是全局参考 table。在任何分支上,当您访问禁止节点时,您将停止并从传递到下一级的图中删除所有 other 禁止节点。
事实上,如果您将禁止节点列表作为图形结构的一部分,则删除可以是一个微不足道的迭代。
从 END 开始执行 BFS - 每当它到达禁止节点时,更新其 distance_from_end 并且不要将其邻居添加到您的队列中。所有未访问的禁止节点不应具有有效的 distance_from_end.
与 (1) 相同,但从 START 开始并更新 distance_from_start
对于所有被禁止的节点,取具有最小 distance_from_start + distance_from_end 的节点。 (请注意,此节点可能不存在,因为节点在这些字段中可能具有无效值,因此应不予考虑)
从头到尾做一个BFS,排除除(3)中发现的所有禁止节点。
根据 4 中执行的 BFS,您将:
- 找到一条不穿过任何禁止节点的路径,该路径比会穿过它的路径短。
- 找到一条确实穿过禁止节点的路径,在这种情况下,它的长度应该等于该节点的 (distance_from_start + distance_from_end)。
- 根本找不到路径,这意味着您在步骤 (3) 中没有找到一个节点,并且在从图中删除所有禁止节点后,您将得到一个 START 和 END 在不同分区中的图。