P3367 【模板】並查集
阿新 • • 發佈:2020-10-10
題目:
題解:純並查集模板題
程式碼:
#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; }