Algorithm 用一组禁止节点寻找两个节点之间的最短路径
我有一个无向无权图,我想在其中找到两个输入节点之间的最短路径。还有一组禁止的节点。如果允许我访问禁止节点集中最多一个节点,如何找到最短路径Algorithm 用一组禁止节点寻找两个节点之间的最短路径,algorithm,graph,shortest-path,Algorithm,Graph,Shortest Path,我有一个无向无权图,我想在其中找到两个输入节点之间的最短路径。还有一组禁止的节点。如果允许我访问禁止节点集中最多一个节点,如何找到最短路径 您可以执行第一个BFS,从一开始就列出可到达的禁止节点(但不能跨越它)。 然后记录从起点到终点的距离。在您的示例2中,每个禁用节点都有一个 在给定路径上距离2和1的端点节点上执行相同的操作 然后取消禁用最佳禁止节点(距起点的最小距离+距终点的距离)。最后在完整的图中做一个BFS 您最终可以保存到所有禁止节点的路径以保存最后的BFS。您可以执行第一个BFS,从
您可以执行第一个BFS,从一开始就列出可到达的禁止节点(但不能跨越它)。 然后记录从起点到终点的距离。在您的示例2中,每个禁用节点都有一个 在给定路径上距离2和1的端点节点上执行相同的操作 然后取消禁用最佳禁止节点(距起点的最小距离+距终点的距离)。最后在完整的图中做一个BFS
您最终可以保存到所有禁止节点的路径以保存最后的BFS。您可以执行第一个BFS,从一开始就列出可到达的禁止节点(但不能穿过它)。 然后记录从起点到终点的距离。在您的示例2中,每个禁用节点都有一个 在给定路径上距离2和1的端点节点上执行相同的操作 然后取消禁用最佳禁止节点(距起点的最小距离+距终点的距离)。最后在完整的图中做一个BFS 您最终可以保存到所有禁止节点的路径,以保存最后的BFS。
- 从一开始就做一个BFS,不要越过禁止的节点
- 从最后做一个BFS,不要越过禁止的节点
- 将路径距离初始化为距离(起点、终点)。如果你的第一次bfs没有达到终点,这将是无限的
- 对于每个禁止节点,do路径距离=min(路径距离,距离(开始,禁止节点)+距离(结束,禁止节点))
- 返回路径距离
复杂性:与BFS相同执行BFS,但将图形作为参数,而不是全局参考表。在任何分支上,当您访问一个禁止节点时,您将停止并从传递到下一级别的图形中删除所有其他禁止节点
事实上,如果将禁止节点列表作为图形结构的一部分,则删除可能是一个简单的迭代。执行BFS,但将图形作为参数,而不是全局引用表。在任何分支上,当您访问一个禁止节点时,您将停止并从传递到下一级别的图形中删除所有其他禁止节点 事实上,如果将禁止节点列表作为图形结构的一部分,则删除可能是一个微不足道的迭代
- 找到一条不穿过任何比要穿过它的节点短的禁止节点的路径
- 找到一条确实穿过禁止节点的路径,在这种情况下,该节点的长度应等于(距离\u起点+距离\u终点)
- 完全找不到路径,这意味着您在步骤(3)中没有找到节点,并且在从图中删除所有禁止的节点后,您将得到一个开始和结束位于不同分区中的图
- 找到一条不穿过任何比要穿过它的节点短的禁止节点的路径
- 找到一条确实穿过禁止节点的路径,在这种情况下,该节点的长度应等于(距离\u起点+距离\u终点)
- 完全找不到路径,这意味着您在步骤(3)中没有找到节点,并且在从图中删除所有禁止的节点后,您将得到一个开始和结束位于不同分区中的图
BFS,存储当前节点,如果您已经访问了node@juvian即使在上面的图表中,这也可能不起作用。您不能简单地存储一个标志来确定您是否已经访问了一个禁止的节点。@Hawklike:请解释为什么您不能这样做。你是程序员:你可以存储任何你想要的状态信息。这不是全局标志:它是与节点关联的标志。我同意它不起作用,但不是因为你所说的原因,因为它有点复杂,需要2级bfs。不过,对于最多只有1个禁止节点的情况,发布了一个更简单的答案