并查集算法主要由两个方法构成:查、并。用于具有连通性的数据结构,比如图,亲戚的亲戚还是亲戚,同伙的同伙还是同伙,同事的同事也是同事。某一写字楼下的快餐店里,A与B在一张桌子吃饭,如果问A与B是不是同事,看看A与B的老板是不是同一人,如果是就是同事,如果不是,就不是。假设目前A与B的老板不是同一人,两个月后,A的公司收购了B的公司,B和A成为了同事,这就是并,合并。假设数组arr,长度为n+1,目前有n个员工,编号分别为1~n,一开始他们一个人是一个公司,各自为政,自己是自己的老板。然后经过一段时间的公司合并,老板的个数减少了。员工的个数增加了。这会儿任意给定两个员工,他们是不是同事?
代码如下:
class UnionFindSets {
vector<int> boss;
public:
UnionFindSets(int n) {
boss.emplace_back(0);
for(int i = 1;i <= n;i++) {
boss.emplace_back(i);
}
}
int getBoss(int i) {
if (boss[i] == i) {
return i;
}
boss[i] = getBoss(boss[i]);
return boss[i];
}
void merge(int x, int y) {
int xB = getBoss(x);
int yB = getBoss(y);
if (xB != yB) {
boss[yB] = xB;
}
}
bool isColleague(int x, int y) {
int xB = getBoss(x);
int yB = getBoss(y);
return xB == yB;
}
};