如何设计O(m)时间算法来计算包含s(s∈V)的G(无向未加权图)的最短周期?
答案 0 :(得分:0)
您可以从节点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,那么从x到s并且在BFS树中形成v到s的路径加上边缘xv形成一个循环。您在第二个BFS中遇到的第一个x和v会为您提供所需的结果。如果不存在这样的x,则s不包含在任何循环中。 循环也是最短的包含s。
两个BFS在O(m)中运行,LCA结构也可以在线性时间内完成,因此整个过程可以在O(m)中实现。
这可能有点矫枉过正。肯定有一个更简单的解决方案。