/* 普通版(无路径压缩) */
int pre[1000];
int find(int x) // 查找我(x)的掌门
{
int r=x; // 委托 r 去找掌门
while(pre[r]!=r) // 如果r的上级不是r自己(也就是说找到的大侠他不是掌门 = =)
r=pre[r]; // r 就接着找他的上级,直到找到掌门为止。
return r; // 掌门驾到~
}
/* 升级版(有路径压缩) */
int pre[1000];
int find(int x) // 查找根节点
{
int r=x;
while( pre[r]!= r ) // 返回根节点 r
r=pre[r];
int i=x, j;
while( i != r ) // 路径压缩
{
j = pre[i]; // 在改变上级之前用临时变量 j 记录下他的值
pre[i] = r ; // 把上级改为根节点
i = j;
}
return r ;
}
void join(int x,int y) // 我想让虚竹和周芷若做朋友
{
int fx=find(x),fy=find(y); // 虚竹的老大是玄慈,芷若MM的老大是灭绝
if(fx!=fy) // 玄慈和灭绝显然不是同一个人
pre[fx]=fy; // 方丈只好委委屈屈地当了师太的手下啦
}