并查集模板

1.初始化

void mem()
{
    for(int i=0;i<n;i++){
        pa[i] = -1;
        ran[i] = 0;
    }
}

2.find函数找根节点

int find(int x)
{
    int fx = x;
    while(pa[fx] != -1)
        fx = pa[fx];
    return fx;
}

3.连接函数

int Union(int x,int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx == fy) return 1;  //已连接,形成环了
    if(ran[fx] > ran[fy])   //短的连接在长的下面
        pa[fy] = fx;
    else if(ran[fy] > ran[fx])
        pa[fx] = fy;
    else{
        pa[fx] = fy;    //高度相等时,被连接的父节点高度+1
        ran[fy] ++;
    }
    return 0;
}

 

posted @ 2020-11-13 20:12  PeacefulGemini  阅读(84)  评论(0)    收藏  举报
回顶部