n树的森林在那里。
用户会给我们一些边缘。
示例: - 1 2,3 4,手段1和2,3和4连接
任务是找到哪个节点属于哪个树?
我的方法: -
array[i] = j
,此处它代表i
的根j
。这是基本方法。通过我们可以很容易地知道哪个节点是哪个树的一部分。
时间复杂度 O(N ^ 2)
但我需要有效的算法,请帮助我。
答案 0 :(得分:2)
听起来好像你在a disjoint-set data structure / the union-find algorithm之后:
不相交集数据结构是一种数据结构,它跟踪分成多个不相交(非重叠)子集的一组元素。联合查找算法是一种对这种数据结构执行两个有用操作的算法:
- 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。
- Union:将两个子集合并为一个子集。
...
不相交集林是数据结构,其中每个集由树数据结构表示,其中每个节点都拥有对其父节点的引用(请参阅spaghetti堆栈)。
在不相交的林中,每个集合的代表是该集合树的根。
Find
跟随父节点,直到到达根节点。Union
通过将一个树的根连接到另一个树的根来将两棵树合并为一个。
答案 1 :(得分:0)
这里的关键是维护一个邻接列表,如图表,然后按照以下方式进行DFS: -
1. find all nodes which do not have incoming edges and form list of roots.
2. do DFS() on each root r and add root[i] = r for each node visited in DFS.
3. So to check if node belongs to a tree you can just check its root.
时间复杂度: - O(E)
用于查找根&因此O(E)
为DFS O(E)
整体,其中E是给定的边数
答案 2 :(得分:0)
另一种方法可以是:
for each node
parent[node] = -1
for each node
if(not visited node)
parent[node]=node
dfs(node , parent)
dfs(node , parent) :
for each node u connected to node :
if(not visited u)
{
parent[u] = parent
dfs(u, parent)
}
这会给O(1) query time
。需要O(N) time as each node is visited once and O(N) space , where N = number of nodes
。