问题描述
我使用DSU(不相交数据集)解决了经典的母亲顶点问题。我已经使用了路径压缩。
我想知道它是否正确。我认为时间复杂度为O(E log(V))。
解决方案按
进行- 初始化每个顶点的父级
- 只要有优势,就尝试加入他们。请注意,如果2已经有其他父对象,则不能合并1-> 2!就像图是1-> 2,3-> 4,2-> 4
- 此处边线1-> 2合并为par [1] = par [2] = 1,而3-> 4合并为par [3] = par [4] = 3。
- 当要合并2-> 4时,因为par [4]!= 4,所以我们再也无法进入该组了。
- 最后,检查所有父顶点,如果它们都相等,则存在母顶点。
代码是:
class dsu
{
public:
int cap;
vector<int> par;
dsu(int n)
{
cap = n;
par.resize(cap);
for(int i=0; i<cap; i++)
par[i] = i;
}
int get(int a)
{
while(a!= par[a])
{
par[a] = par[par[a]];
a = par[a];
}
return a;
}
void join(int a,int b)
{
a= get(a);
int pb= get(b);
if(pb!=b)
return ;
par[pb] = a;
}
};
int findMother(int n,vector<int> g[])
{
// Your code here
// do disjoint data set,if everyone;s parent is same woohla! i have found the mother vertex
dsu arr(n);
for(int i=0; i< n; i++)
{
for(auto a: g[i])
{
arr.join(i,a);}
}
int mother = arr.get(0);
for(int i=1; i<n; i++)
{
if(mother != arr.get(i))
return -1;
}
return mother;
}
解决方法
经过一些研究,我发现这是正确的。可以用来查找母顶点。