我想使用一组节点找到有向非循环图的连通分量。什么是解决这个问题最有效的方法?
已连接的组件:如果其中一个节点是前任或 另一个节点的后继者,它们位于相同的连接组件中。
例如,我们说我有以下图表和vector = [2,4,5,6,3]
。对于此向量,有两个连接组件,如下所示。
C1 = [2,4,5,6]
C2 = [3]
我的解决方案:
您怎么看?
答案 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