喵哈哈村的代码传说 第四章 并查集

有一个非常大的村子,叫做喵哈哈村,一开始他们都互相不认识,但是渐渐地,他们就会相互来往,所以就会有以下问题的产生:

1 x y,x家与y家成为朋友

2 x y,提问x家和y家是否为朋友,间接成为朋友也算。

本题包含若干组测试数据。
第一行两个整数n,m,表示这个村子有n户家庭,一开始他们都不认识。含有m个问题。
接下来m行:
1 x y
2 x y
分别表示操作和询问。
满足1<=n,m<=100000,注意x

是朋友输出Yes,否则输出N

 
3 4
2 1 2
2 1 1
1 1 2
2 1 2
No
Yes
Yes
题解

这道题就是并查集的题目,就是裸的并查集。

    #include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+6;
int n,m;
int fa[maxn];
int fi(int x){
    return fa[x]==x?x:fa[x]=fi(fa[x]);
}
int uni(int x,int y){
    x = fi(x),y = fi(y);
    fa[x]=y;
}
void solve(){
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=0;i<m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(a==1){
            uni(b,c);
        }else{
            if(fi(b)==fi(c)){
                cout<<"Yes"<<endl;
            }else{
                cout<<"No"<<endl;
            }
        }
    }
}
int main(){
    while(cin>>n>>m)solve();
} 
 
原文地址:https://www.cnblogs.com/gfdybz/p/6555206.html