①路径压缩:对 find函数: 进行修改
②通过根的秩优化:union函数: 进行修改
秩:就是树的高度。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4;
int par[maxn];
int rank1[maxn];
void init(int n)
{
memset(rank1, 0, sizeof(rank1));
for(int i = 1;i <=n;i++)par[i] = i;
}
int found(int x)/****寻找父亲函数***/
{
if(par[x] == x)return par[x];
else return
par[x] = found(par[x]);/***路径压缩 寻找父亲的同时,将中间所经过的点都指向了根********/
}
void Union(int x, int y)
{
int rootx = found(x);
int rooty = found(y);
if(rootx == rooty)return;
/*****通过根的 秩的 大小, 秩小的指向秩大的********/
if(rank1[rootx] > rank1[rooty])
{
par[rooty] = rootx;
/***对于小的指向大的 不会 改变 秩大的根 的秩**/
}
else if(rank1[rootx] <rank1[rooty])
{
par[rootx] = rooty;
/***对于小的指向大的 不会 改变 秩大的根 的秩**/
}
/*******如果秩相同 rootx 的父亲指向 rooty*****/
else if(rank1[rootx] == rank1[rooty])
{
par[rootx] = rooty;
rank1[rooty]++;
/*****因为秩相同 这样会使 rooty的秩 增加1********/
}
}
int main()
{
int n;
cin>>n;
init(n);
return 0;
}