并查集的实现

利用并查集可以十分高效地判断两个元素是否在同一个集合中,下面是并查集的大致实现

int par[MAX_N];//父亲
int rank[MAX_N];//树的高度
void init(int n)
{
    for(int i=0;i<n;i++)
    {
        par[i]=i;
        rank[i]=0;
    }
}


int find(int x)//查询树的根
{
    if(par[x]==x)
    {
        return x;
    }
    else 
    {
        return par[x]=find(par[x]);//递归查找
    }
}


void unite(int x,int y)//合并x和y所在的集合
{
    x=find(x);
    y=find(y);
    if(x==y)return;
    if(rank[x]<rank[y])
    {
        par[x]=y;//如果x的高度小于y的高度,则x插到y的下层(减少树的退化)
    }
    else 
    {
        par[y]=x;//否则,y插入到x的下层
        if(rank[x]==rank[y])rank[x]++;
    }
}


bool same(int x,int y)
{
    return find(x)==find(y);
}

























posted @ 2018-05-01 21:37  erge1998  阅读(163)  评论(0编辑  收藏  举报