P3367 【模板】并查集

题目:

传送门

 

题解:纯并查集模板题

 

代码:

#include<iostream>
using namespace std;

int n,m;        //n为结点数量
const int maxn=1e4+10;

int par[maxn];        //储存祖先结点
int rank1[maxn];       //储存结点所在的高度

//解题思路:按照并查集模板的三部曲+same判断函数
void init(){     //初始化
    for(int i=1;i<=n;i++){      //
        par[i]=i;
        rank1[i]=0;
    }
}

int find(int x){      //查找x祖先
    if(par[x]==x)  return x;        //如果x的祖先就是自己直接返回
    else return par[x]=find(par[x]);    //如果x的祖先不是自己 则需要通过find函数递归找到x的祖先 同时对x的父亲们也一起顺便找共同祖先
}

void unite(int x,int y){
    x=find(x);
    y=find(y);

    if(x==y)    return;

    if(rank1[x]>rank1[y]){
        par[y]=x;
    }else{
        par[x]=y;
        if(rank1[x]==rank1[y]){
            rank1[y]++;
        }
    }
}

bool same(int x,int y){
    if(find(x)==find(y))    return true;
    else return false;
}

int main(){
    cin>>n>>m;

    init();
    int x,y,z;
    for(int i=1;i<=m;i++){
        cin>>z>>x>>y;
        if(z==1){
            unite(x,y);
        }else if(z==2){
            if(same(x,y)){          //代表祖先相同
                // cout<<"x:"<<x<<" y:"<<y<<" "<<par[x]<<" "<<par[y]<<endl;
                cout<<"Y"<<endl;
            }else cout<<"N"<<endl;
        }
    }

    return 0;
}

 

posted @ 2020-10-10 19:45  neverstopcoding  阅读(126)  评论(0编辑  收藏  举报