树根发现

时间:2011-08-05 20:44:22

标签: algorithm tree computer-science graph-algorithm

我如何从一组节点和边缘获得带有根的树? (我正在使用连通矩阵,每个边都有权重:graph [i] [j],没有任何负边缘)。后来我需要做DFS并在那棵树中找到LCA,所以最好是优化。

4 个答案:

答案 0 :(得分:2)

我认为你的矩阵表示子关系(即M[i][j]告诉ji的孩子),directed graph G(V,E)

您有两种不同的策略:

  • 使用位向量,遍历矩阵的每个单元格,如果单元格的权重不为空,则在向量中标记子索引):根是未在向量中设置的顶点,
  • 查找列(或行,如果您的矩阵是第一列),其单元格全部为空(没有祖先),

第二种解决方案更适用于密集矩阵。最差的运行时间是根是最后一个条目(O(V²))。在这种情况下,如果你的图表有很多,你可以在第一次点击时停止,或者直到结束运行以获得所有的根。

第一个更适合稀疏矩阵,因为你必须遍历所有单元格。它的运行时间是O(E)。你也可以通过这种算法获得所有的根源。

如果您确定图表只有一个根,则可以使用walk the edge up技术,如其他答案中所述。

答案 1 :(得分:0)

从任何图形中进行DFS搜索都会给你一棵树(当然,假设图形是连接的)。

你可以迭代它,并从每个节点开始作为一个可能的根,你将最终以这种方式得到一个生成树,如果有的话。复杂性将是O(V ^ 2 + VE)

编辑:它的工作原理是因为对于任何有限图,如果根节点节点a到节点b,则在DFS创建的树中将存在从a到b的路径。所以,假设有一个可能的生成树,有一个根r,你可以从V中获取每个v,当r作为root选择r时,在r中有一条从r到每个v的路径,所以会有是生成树中从r到它的路径。

答案 2 :(得分:0)

在树中选择一个节点并向上走,即逆着边的方向。当您找到没有祖先的节点时,您就拥有了根。

如果您需要经常这样做,请记住每个节点的父节点。

答案 3 :(得分:0)

这是一个计算上很大的SLOWER版本,它也更容易编码。对于小图表,它很好。

找到度为零的节点!

您必须计算所有节点度数O(n),但根据设置,这通常更容易编码,因此不容易出错。