我正在学习算法,看到了这样的一个练习题
我可以用指数时间来解决这个问题,但是我不知道如何证明它可以在线性时间O(E+V)内解决
非常感谢任何帮助。
我正在学习算法,看到了这样的一个练习题
我可以用指数时间来解决这个问题,但是我不知道如何证明它可以在线性时间O(E+V)内解决
非常感谢任何帮助。
a
和b
,因此您可以遍历来自部分a
的所有顶点,并查找所有相邻的边,如果任何一条边形成了部分a
和部分b
之间的链接,则找到了新的最小生成树。for(all vertices in part a){
u = current vertex;
for(all adjacent edges of u){
v = adjacent vertex of u for the current edge
if(u and v belong to different part of the MST) found new MST;
}
}
复杂度为 O(V + E)
注意:您可以使用简单的数组来检查顶点是否在 MST 的部分 a
或部分 b
中。
另外请注意,为了获得 O(V + E) 的复杂度,您需要使用图的邻接表表示。
假设你在删除边之后得到了一个图G'。G'由两个连通分量组成。
让图中的每个节点都有一个组件ID。根据它们所属的组件,为所有节点设置componentID。例如,在G'上进行简单的BFS可以完成此操作。这是一个O(V)操作,因为G'仅具有V个节点和V-2条边。
一旦所有节点都被标记,就可以遍历所有未使用的边,并找到连接两个组件(两个节点的componentIDs将不同)的最小权重。这是一个O(E)操作。
因此,总运行时间为O(V+E)。