1. 程式人生 > 實用技巧 >P3367 【模板】並查集

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; }