题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数NM,表示共有N个元素和M个操作。

接下来M行,每行包含三个整数Zi,Xi,Yi

当 Zi=1时,将XiYi所在的集合合并。

Zi=2时,输出XiYi是否在同一集合内,是的输出Y;否则输出N。

输出格式

对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N。

 

 数据范围

1≤n≤104,1≤m≤2×105

思路:

这道题是并查集的模板题。我们只需要维护好并查集的find和union两个基本操作即可(注意要使用路径压缩,一定要确定好每一个集合的代表元素唯一)。

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int father[10001]; 
 5 int m,n,i,x,y,z;
 6 int find(int x){
 7     if(father[x]!=x){
 8         return father[x]=find(father[x]);
 9     }else{
10         return x;
11     }
12 }
13 void unionn(int r1,int r2){
14     father[r2]=r1;
15 }
16 int main(){
17     cin>>n>>m;
18     for(i=1;i<=n;i++){
19         father[i]=i;
20     }
21     for(i=1;i<=m;i++){
22         cin>>z>>x>>y;
23         if(z==1){
24             int r1=find(x);
25             int r2=find(y);
26             if(r1!=r2){
27                 unionn(r1,r2);
28             }
29         }else if(z==2){
30             if(find(x)==find(y)){
31                 cout<<'Y'<<endl;
32             }else{
33                 cout<<'N'<<endl;
34             }
35         }
36     }
37     return 0;
38 } 

 

 

posted on 2020-07-26 11:10  郭谦  阅读(309)  评论(0)    收藏  举报