Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用一组禁止节点寻找两个节点之间的最短路径_Algorithm_Graph_Shortest Path - Fatal编程技术网

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,不要越过禁止的节点
  • 将路径距离初始化为距离(起点、终点)。如果你的第一次bfs没有达到终点,这将是无限的
  • 对于每个禁止节点,do路径距离=min(路径距离,距离(开始,禁止节点)+距离(结束,禁止节点))
  • 返回路径距离

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


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

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

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

  • 从末端开始执行BFS-每当到达禁止节点时,更新其距离末端的距离,并且不要将其邻居添加到队列中。所有未访问的禁止节点与\u端之间的距离不应有效

  • 执行与(1)相同的操作,但从起点开始并更新距离

  • 对于所有被禁止的节点,取从\u开始的最小距离\u+从\u结束的最小距离\u的节点。(请注意,此节点可能不存在,因为这些字段中的节点可能有无效值,因此应断开连接)

  • 从开始到结束执行BFS,断开除(3)中发现的节点外的所有禁止节点

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

    • 找到一条不穿过任何比要穿过它的节点短的禁止节点的路径
    • 找到一条确实穿过禁止节点的路径,在这种情况下,该节点的长度应等于(距离\u起点+距离\u终点)
    • 完全找不到路径,这意味着您在步骤(3)中没有找到节点,并且在从图中删除所有禁止的节点后,您将得到一个开始和结束位于不同分区中的图
  • 从末端开始执行BFS-每当到达禁止节点时,更新其距离末端的距离,并且不要将其邻居添加到队列中。所有未访问的禁止节点与\u端之间的距离不应有效

  • 执行与(1)相同的操作,但从起点开始并更新距离

  • 对于所有被禁止的节点,取从\u开始的最小距离\u+从\u结束的最小距离\u的节点。(请注意,此节点可能不存在,因为这些字段中的节点可能有无效值,因此应断开连接)

  • 从开始到结束执行BFS,断开除(3)中发现的节点外的所有禁止节点

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

    • 找到一条不穿过任何比要穿过它的节点短的禁止节点的路径
    • 找到一条确实穿过禁止节点的路径,在这种情况下,该节点的长度应等于(距离\u起点+距离\u终点)
    • 完全找不到路径,这意味着您在步骤(3)中没有找到节点,并且在从图中删除所有禁止的节点后,您将得到一个开始和结束位于不同分区中的图

  • BFS,存储当前节点,如果您已经访问了node@juvian即使在上面的图表中,这也可能不起作用。您不能简单地存储一个标志来确定您是否已经访问了一个禁止的节点。@Hawklike:请解释为什么您不能这样做。你是程序员:你可以存储任何你想要的状态信息。这不是全局标志:它是与节点关联的标志。我同意它不起作用,但不是因为你所说的原因,因为它有点复杂,需要2级bfs。不过,对于最多只有1个禁止节点的情况,发布了一个更简单的答案