什么是并查集:
1:将n个不同的元素划分为不想交集合
2:在每个集合中,选择其中某个元素代表所在集合
三个基本操作
make_set(x):把每一个元素初始化为一个集合
find_set(x):查找一个元素所在的集合。在执行查找操作时,要沿着父结点指针一直找下去,直到找到树根为止
判断两个元素是否属于同一集合,只要判断它们所在集合的祖先是否相同即可
合并两个集合,也是将一个集合的祖先作为另一个集合的祖先
union_set(x,y):利用find_set()找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先
void make_set(int x) //初始化,将每一个点变成一个集合
{
fa[x]=x; //该点的所对应的父结点
rank[x]=0; //以x为根节点的所对应的高度
}
int find_set(int x) //查找一个元素所在的集合
{
if(x!=fa[x]) fa[x]=find_set(fa[x]); //利用递归的方式一直寻找到他的根结点
return fa[x];
}
void union_set(int x,int y) //利用find_set()找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先
{
x=find_set(x);
y=find_set(y);
if(x==y) return ; //标识他们已经在相同的一个集合内
if(rank[x]<rank[y]) fa[x]=y; //以x为根节点的高度要小,所以讲x合并到y的集合内,就是x的父结点为y
else{
fa[y]=x;
if(rank[x]=rank[y]) rank[x]++; //两个的高度相同的话,以为这无论谁做根结点,他们多对应的高度都要加1;
}
}