我如何从一组节点和边缘获得带有根的树? (我正在使用连通矩阵,每个边都有权重:graph [i] [j],没有任何负边缘)。后来我需要做DFS并在那棵树中找到LCA,所以最好是优化。
答案 0 :(得分:2)
我认为你的矩阵表示子关系(即M[i][j]
告诉j
是i
的孩子),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),但根据设置,这通常更容易编码,因此不容易出错。