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