假设我有一个带有顶点v1 ... vn和边的无向图G.现在它是邻接列表表示。
对于每个时刻,a具有此时“活动”的一些顶点子集作为输入。我需要在这个时间点找到这个顶点子集中的所有连通分量。
现在我已经使用union-find数据结构实现了这个:
initialize sets for every active vertex so that every vertex has itself as "representative" (also called "parent")
for every active vertex v
for all neighbours of v in G v_neighbour
if v_neighbour is active
union set of v and set of v_neighbour
它应该可行,但我想知道是否有更优化的方法呢? 那算法的运行时间是多少? O(N * M)?
答案 0 :(得分:3)
在连接的组件耗尽后重新启动的BFS或DFS可以轻松找到O(V+E)
connectedComponentNumber= 0
While there is a node that was not discovered yet:
connectedComponentNumber= connectedComponentNumber+ 1
v = some vertex that was not discovered yet
vertices = BFS(v) //all vertices connected to v
set all nodes in vertices as belong to connected component connectedComponentNumber
答案 1 :(得分:0)
我想在上面的回复中添加一件事,如果你在邻接列表表示中找到活动顶点,它将增加V个步骤,因此运行时间将增加到O(V ^ 3)。这可能需要恒定的时间如果我们为此维护另一个数据结构。