并查集详解

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] = 4father[5] = 6,father[6] = 6
并查集详解

相关文章:

  • 2022-12-23
  • 2021-06-29
  • 2021-09-28
  • 2022-12-23
  • 2022-12-23
  • 2022-03-01
  • 2022-12-23
猜你喜欢
相关资源
相似解决方案