查找连接的组件

时间:2015-04-29 00:58:05

标签: algorithm graph graph-algorithm directed-acyclic-graphs

我想使用一组节点找到有向非循环图的连通分量。什么是解决这个问题最有效的方法?

  

已连接的组件:如果其中一个节点是前任或   另一个节点的后继者,它们位于相同的连接组件中。

例如,我们说我有以下图表和vector = [2,4,5,6,3]。对于此向量,有两个连接组件,如下所示。

C1 = [2,4,5,6]
C2 = [3]

enter image description here

我的解决方案:

  • 使用深度值
  • 对节点排序
  • 选择一个节点
  • 检查其他节点是否是后继节点。如果是这样,请继续 看着。如果没有,请停止并转到步骤2.

您怎么看?

2 个答案:

答案 0 :(得分:0)

我希望我理解你对连通组件的定义......如果是这样的话

我同意@anonymous,您可以简单地使图表无向并使用简单的DFS找到连接的组件......

我不太了解你原来的想法,至少我认为实现会有点复杂,比如边缘{1 - > 2,2 - > 4,3 - > 4}, 节点#1和#3将在列表的开头排序,你怎么知道{1,2,3,4}是一个连接的组件?

无论如何,复杂性与简单的DFS方法相同,充其量只是O(V)

(如果有人认为这个答案是正确的,请将所有学分给@anonymous!)

答案 1 :(得分:-1)

查找连接组件的方法如下:

while(anymore_root_vertex_tostartfrom){
    vertex v=pick_a_vertex;
    remove vertex from root_vertex_list;
    initialize connected_comp_list_of_vertices;
    do a breadth_first traversal from this vertex
    keep adding the vertex you encounter in bfs to connected_comp_list_of_vertices
    of that root
}

我建议阅读更多关于图形处理的内容。查找连通组件,BFS,DFS遍历具有相当标准的技术。关于这一主题的优秀书籍是Skiena's Algoritham Design Manual