如何设计一个 O(m) 时间算法来计算包含 s 的 G(undirected unweighted graph) 的最短循环?
How to design an O(m) time algorithm to compute the shortest cycle of G(undirected unweighted graph) that contains s?
如何设计一个O(m)时间的算法来计算包含s(s ∈ V)的G(无向无权图)的最短环?
您可以 运行 从您的节点 s 开始的 BFS 作为起点,这将为您提供 BFS 树。之后,您可以在此 BFS 树上构建最低公共祖先 (LCA) 数据结构。这可以通过 Tarjan's lowest-common-ancestor algorithm 来完成。我不会在这里详细介绍。给定两个节点 v 和 w,LCA 可以让您找到树(在我们的例子中是 BFS 树)中具有 v 和 w 作为后代的最低节点。这个想法是当你考虑在我们的 BFS 树中连接的两个节点时,你想检查它们到根的路径(在这种情况下是 s)+ 连接它们的边是否形成一个循环(与 s)。如果他们的 LCA 是 s,就会出现这种情况。
假设您已经构建了 LCA,您 运行 第二个 BFS。在扩展节点 v 的邻居时,您还需要考虑已标记为已探索的节点。假设 x 是 v 的邻居,因此 x 已经被探索过。如果 v 和 x 的 LCA 是 s,则 BFS 树中从 x 到 s 和从 v 到 s 的路径加上边 xv 形成一个循环。您在第二个 BFS 中遇到的第一个 x 和 v 会为您提供所需的结果。如果不存在这样的 x,则 s 不包含在任何循环中。
循环也是最短的包含s.
O(m)中的两个BFS 运行和LCA构建也可以在线性时间内完成,因此整个过程可以在O(m)中实现。
这可能有点矫枉过正。肯定有一个更简单的解决方案。
如何设计一个O(m)时间的算法来计算包含s(s ∈ V)的G(无向无权图)的最短环?
您可以 运行 从您的节点 s 开始的 BFS 作为起点,这将为您提供 BFS 树。之后,您可以在此 BFS 树上构建最低公共祖先 (LCA) 数据结构。这可以通过 Tarjan's lowest-common-ancestor algorithm 来完成。我不会在这里详细介绍。给定两个节点 v 和 w,LCA 可以让您找到树(在我们的例子中是 BFS 树)中具有 v 和 w 作为后代的最低节点。这个想法是当你考虑在我们的 BFS 树中连接的两个节点时,你想检查它们到根的路径(在这种情况下是 s)+ 连接它们的边是否形成一个循环(与 s)。如果他们的 LCA 是 s,就会出现这种情况。
假设您已经构建了 LCA,您 运行 第二个 BFS。在扩展节点 v 的邻居时,您还需要考虑已标记为已探索的节点。假设 x 是 v 的邻居,因此 x 已经被探索过。如果 v 和 x 的 LCA 是 s,则 BFS 树中从 x 到 s 和从 v 到 s 的路径加上边 xv 形成一个循环。您在第二个 BFS 中遇到的第一个 x 和 v 会为您提供所需的结果。如果不存在这样的 x,则 s 不包含在任何循环中。 循环也是最短的包含s.
O(m)中的两个BFS 运行和LCA构建也可以在线性时间内完成,因此整个过程可以在O(m)中实现。
这可能有点矫枉过正。肯定有一个更简单的解决方案。