并查集的作用是判断两个元素是否属于同一集合。
我们用单个元素代表集合。
我们判断是否属于同一集合的标准是判断这两个元素所属的元素是否相同。
然后我们要实现以下功能,判断是否是同一集合,将两个元素并入一个集合。
设立一个p[i]代表元素i所属集合的代表元素。(单个元素集合的代表元素就是它自己
1.判断是否是同意集合只需判断代表元素是否相同即可,那我们实现寻找代表元素
int find(int x)
{
if(x != p[x]) p[x] = find(p(x));
return p[x]
}
2.将两个元素并入,将i并入j
p[find(i)] = find(j);
思路:对于一个数i,他集合的代表元素p[i]就是我们在输出i时应当实际输出的数,而我们输出过一个数i时,我们应该将p[i] = find(i+1)//find的含义就是输出i+1时实际要输出的数,也就是说输出i时的数是实际i+1的数。
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 100000+10;
int a[N];//储存数据
int p[N];//输出i时应该输出b[i]
int myFind(int n)//输出i时实际应当输出的数
{
if(n != p[n]) p[n] = myFind(p[n]);//压缩路径
return p[n];//隐式地表示了递归终点,也就是代表元素就是它自己
}
int main()
{
for(int i = 0; i <= N; ++i)//进行初始化
{
p[i] = i;
}
int n;
cin>>n;
for(int i = 1; i <= n; ++i)
{
cin>>a[i];
a[i] = myFind(a[i]);
p[a[i]] = myFind(a[i]+1);//下次输出a[i]时应该加1
cout<<a[i]<<" ";
}
return 0;
}