并查集
文章:并查集原理
- 作用:
- 合并:将两个不相交的集合合并为一个集合
- 查询:查询两个元素是否在同一个集合中
初始化
假如有编号为1, 2, 3, …, n的n个元素,我们用一个数组fa[]来存储每个元素的父节点(因为每个元素有且只有一个父节点,所以这是可行的)。一开始,我们先将它们的父节点设为自己。
int f[N];
int re[N];
int n,m,p;
void init()
{
for(int i = 1; i <= n; i++)
{
f[i] = i;
}
}
查找根节点(路径压缩)
int find(int x)// 利用递归思想
{
if(f[x] == x)
{
return x;//如果该节点等于自己,就表明该节点为根节点,就返回该节点
}
else
{
f[x]=find(f[x]); //将父节点也设为根节点
return f[x]; //返回父节点
}
}
合并
void merger(int a,int b)
{
int j = find(a),i = find(b);//先找到两个根节点
f[j] = i; //设置为新的根节点
}
- 题目:
- 洛谷
- P1551 亲戚
- P3958 奶酪
- 洛谷