Algorithm 无向图的连通分量

Algorithm 无向图的连通分量,algorithm,graph-algorithm,Algorithm,Graph Algorithm,假设我有一个顶点为v1…vn和边的无向图G。现在它是在邻接列表表示中 对于每一时刻,输入此时处于“活动”状态的顶点子集。我需要在这个时间点的子集中找到所有连接的组件 现在,我使用union find数据结构实现了这一点,如下所示: initialize sets for every active vertex so that every vertex has itself as "representative" (also called "parent") for every active v

假设我有一个顶点为v1…vn和边的无向图G。现在它是在邻接列表表示中

对于每一时刻,输入此时处于“活动”状态的顶点子集。我需要在这个时间点的子集中找到所有连接的组件

现在,我使用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)

A或在连接的组件耗尽后重新启动的组件可以在
O(V+E)


我想在上面的回复中添加一点,如果您在邻接列表表示中查找活动顶点,它将增加V步数,因此运行时间将增加到O(V^3)。如果我们为此维护另一个数据结构,这可能需要固定的时间。

是的,感谢您的建议。我现在正在实现迭代DFS。它应该会更快。但我想强调一点,另一个程序员使用了某种DFS(虽然不是很优化)和递归,这比我的实现糟糕得多。但我认为非递归优化版本应该可以正常工作。@user1685095递归与否,这是线性时间。无论您使用的是操作系统堆栈还是自定义堆栈数据结构,在实践中都不会产生实际的差异。该实现可能还有另一个问题,例如,如何表示访问的顶点集或图形本身。
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