洛谷P3367 【模板】并查集
洛谷P3367 【模板】并查集
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入输出格式
输入格式
第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi
当Zi=1时,将Xi与Yi所在的集合合并
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N
输出格式
如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N
输入输出样例
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据,N<=10,M<=20;
对于70%的数据,N<=100,M<=1000;
对于100%的数据,N<=10000,M<=200000。
solution
并查集的模板题
不解释了,直接看注释
code
1 #include<iostream> 2 using namespace std; 3 int n,m,a[10001]; 4 int getf(int i){//查询i的祖先 5 if(a[i]==i) return i;//要是祖先就是他自己,直接返回 6 return a[i]=getf(a[i]);//若不是,就再找。同时把a[i]的祖先也变成即将找的祖先 7 }//路径压缩 8 void merge(int x,int y){//合并 9 //分别找出他们的祖先 10 if(getf(x)!=getf(y)) //这一行可有可无(有更好)。可以在合并前先判断他们是不是在同一个集合里面 11 a[getf(x)]=getf(y);//避免冗余 12 return; 13 } 14 bool inquire(int x,int y){//查询是否在一个集合中 15 return getf(x)==getf(y); 16 } 17 int main() 18 { 19 cin>>n>>m; 20 //初始化 21 for(int i=1;i<=n;i++) 22 a[i]=i; 23 int z,x,y; 24 for(int i=1;i<=m;i++) 25 { 26 cin>>z>>x>>y; 27 if(z==1) 28 merge(x,y); 29 else 30 cout<<(inquire(x,y)?"Y":"N")<<endl; 31 } 32 return 0; 33 }