ACM模版——并查集

/* 普通版(无路径压缩) */
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;                    // 方丈只好委委屈屈地当了师太的手下啦
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/80981173