一,
并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题,常常在使用中以森林来表示。
二,主要操作
1.初始化
把每个点所在集合初始化为其自身。
通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
2.查找
查找元素所在的集合,即根节点。
3.合并
将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。
3.例题:朋友圈
有n个人,编号1-n。
现在有一个舞会,在舞会上,大家会相互介绍自己的朋友。
即: 如果a认识b,b认识c。那么在舞会上,a就会通过b认识到c。
现在,给出m个关系
每个关系描述:
a b
表示 编号为a和编号为b的人是朋友关系。
最后问,会有多少个朋友圈。
代码实现
#include<stdio.h>
int unionsearch(int root);
int db[5000000]//每个朋友圈的代表,如db[2]=3指编号为2的人朋友圈的代表是编号为3的人
int main()
{
int n, m, pyq, i, start, end, root1, root2,sum=0;
while(scanf("%d", &n)!=EOF)
{
scanf("%d", &m);
for(i = 1; i <= n; i++)
db[i] = i;//初始化每个人的朋友圈只有自己一人
while(m--)
{
sum=0;
scanf("%d%d", &start, &end);
root1 = unionsearch(start);
root2 = unionsearch(end)//查找代表
if(root1 != root2)
{
db[root1] = root2;
}
}
for(int i=1;i<=n;i++)
{
if(db[i]==i)
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}
int unionsearch(int root)//让一个朋友圈的代表是同一人,返回代表
{
while(root!=db[root])
{
root=db[root];
}
return root;
}
来源:CSDN
作者:姚寿明
链接:https://blog.csdn.net/m0_45861545/article/details/104076093