MergingSets

一般的并查集只有find,merge两种,写一个最简单的版本代码可以非常短,find包括递归 非递归,普通和压缩路径这么四种,据瞿神所说递归
版的效率不会差到哪儿去,merge又分平衡版和非平衡版的merge

初始用-1表示集合头,否则p[x]表示x的所在树形结构的父亲所在的index, -1表示是集合头
普通查找

int find(int x)
{
    if(a[x]==-1)
        return x;
    else
        return find(a[x]);
}

带压缩路径的查找

int find(int x)
{
    if(a[x]==-1)
        return x;
    else
        return a[x]=find(a[x]);//瞿神指出了错误
}

void merge(int x, int y)
{
    int xi=find(x),yi=find(y);
    if(xi!=yi) p[xi]=yi;//此处感谢卓连翔师弟提醒,一直都是有bug的,如果上课教的-1版本,那么merge一定要判下不是同一个集合再merge
    
}

Posted by richard爱闹 - 8月 21 2014
如需转载,请注明: 本文来自 Richard