并查集详解
1.什么是并查集
所谓并查集就是Union + Find + Set
2.为什么要有并查集
3.简单案例
3.1 需求
输入:两个整数n,m,分别代表的是总人数和待输入的父子关系。接下来输入m行,每行的数据样式是:a,b。其代表的意思是:a 是 b 的儿子。
输出:输出有多少组家庭?。
3.2 代码
#include <cstdio>
#define maxn 1000
int n,m;//总人数 好朋友组数
int father[maxn];
//初始化操作
void init(){
int i;
for(i = 0;i <= n; i++){
father[i] = i;//初始化---每个节点的父节点为该节点本身
}
}
int findFather(int x){
//下面这个是循环找出最顶层的父亲
while(x != father[x]){
x = father[x];
}
return x;
}
void Union(int a,int b){
int faA = findFather(a);
int faB = findFather(b);
//是不是同一个祖先,如果是,则将faA 的祖先设置为B
if(faA != faB){
father[faA] = faB;
}
}
int main(){
int i,j;
scanf("%d %d",&n,&m);
init();
int a,b;//a与b是朋友关系
for(i = 0;i < m;i++){
scanf("%d %d",&a,&b);
Union(a,b);
}
int group = n;
for(i = 1;i<= n;i++){
printf("%d ",father[i]);
if(father[i]!=i)
group --;
}
printf("\ngroup = %d",group);
}
测试用例
3 2
1 3
3 4
5 3
1 4
3 5
4 2
5 3
4 2
1 4
3 5
6 4
1 4
3 5
4 2
5 6
4.执行结果
使用测试用例:
6 4
1 4
3 5
4 2
5 6
表明这里有6个人,其中 1 是 4的儿子;3是5的儿子… 5是 6的儿子。那么最后的输出就是。这里一共有两个家庭。
而输出 的 4 2 5 2 6 6表示的意思就是:father[1] = 4… father[5] = 6,father[6] = 6