题意

  • n个人,m次操作
  • 每次操作要么在a,b之间建立亲戚关系,要么查询a,b之间是否为亲戚

思路

  • 并查集典例,最开始每个结点的父亲是自己,建立,就合并两个,查询就查询

AC代码

#include<bits/stdc++.h>
using namespace std;

int fa[20202];

int find(int q){
    return fa[q]==q?q:fa[q]=find(fa[q]);
}
void merge(int a,int b){
    fa[find(a)]=find(b);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,m,op;
    string s,s1,s2;
    cin >> n >> m ;
    map<string,int>mp;

    for(int i=1;i<=n;i++){
        cin >> s ;
        mp[s]=i;
        fa[i]=i;
    }
    for(int i=0;i<m;i++){
        cin >> op >> s1 >>s2 ;
        if(op==1){
            merge(mp[s1],mp[s2]);
        }else{
            if(find(mp[s1])==find(mp[s2])){
                cout<<1<<'\n';
            }else{
                cout<<0<<'\n';
            }
        }
    }
    
}