思路
①合并两个集合
②询问2个元素是否在集合中
每个集合用一棵树表示,树根的编号为整个集合的编号。
判断树根相同只需要看父节点是否相同,不同则往上找父节点的父节点……直到走到树根。
合并2集合只需要直接连接。
模板
void init() {
for (int i=1; i<=n; i++) {
fa[i] = i; //用父节点记录当前合并集合的size
s[i] = 1;
}
}
初始化。
int find(int x) {
if(fa[x]==x) return x;
else fa[x] = find(fa[x]);
return fa[x];
}
寻找父节点。(递归)
void merge(int a,int b) {
int x = find(a);
int y = find(b);
fa[x] = y;//连接(相当于红线)
s[y] += s[x];//size也要加起来,合并成一个
}
合并集合。
bool ask(int a,int b) {
return find(a)==find(b);
}
询问是否联通。