并查集

并查集,今晚重新做了kruscal,但是一直WA好多发,发现用的并查集错了,发现以前没有全理解并查集,所以总结一下并查集,以便加深理解……

算法原理:

通过find函数找出该节点的根节点,

通过UNION函数将两棵树合并。

加入rank[N]来记录每个节点的秩(即树的高度),并按秩进行合并,可避免合并时的最糟糕情况,(树形为一条直线)

通过路径压缩可以减少每次寻找根节点的次数。

rank[n]数组中,树是倒立的,从下面开始树越高,说明结点上面的才是父子结点……所以秩越大,例如rank[x]>rank[y],  则   father[y]=x;即让子结点指向父子结点,就可以进行合并了……
int find(int x)  
{  
    return father[x]==x?x:father[x]=find(father[x]);  //查找父子结点并且压缩路径
}  
void un(int x,int y)  
{  
    if(find[x]==find[y]) return;  
    if(rank[x]>rank[y]) father[y]=x;  
    else  
    {  
        if(rank[x]==rank[y]) rank[y]++;  //合并
        father[x]=y;  
    }  
} 

你可能感兴趣的:(并查集)