find函数
int find(int x) //查找我(x)的掌门
{
int r=x; //委托 r 去找掌门
while (pre[r ]!=r) //如果r的上级不是r自己(也就是说找到的大侠他不是掌门)
r=pre[r ] ; // r 就接着找他的上级,直到找到掌门为止。
return r ; //找到掌门了
}
join函数
//我们知道每个人的初始掌门是自己,那么如何把关系写进去呢?
void join(int x,int y) //我想让x和y做朋友
{
int fx=find(x),fy=find(y); //x的老大是fx,y的老大是fy
if(fx!=fy) //fx和fy显然不是同一个人
pre[fx ]=fy; //fx当了fy的手下
}
.
.
.
.
.
当用到带权并查集时,一般这样写;
对路径压缩进行处理:
int find(int x)
{
if(x!=pre[x])
{
int t=pre[x];
pre[x]=find(pre[x]);
dis[x]+=dis[t];//儿子结点继承本身加上父亲节点的状态;
}
return pre[x];
}