题解:P1551 亲戚

题目传送门

前提紧要-并查集

sol

很典的一道并查集的题目,首先根据每一组 \(m_i\)\(m_j\),直接将它们两个的祖先合并到一个祖先上,然后根据每一组 \(p_i\)\(p_j\) 只需要判断它们是不是同一个祖先即可。具体细节见代码。

:::info[code]{open}

#include<bits/stdc++.h>
using namespace std;
int n,m,p;
int fa[100010];//祖先
int find(int k){//找祖先,路径压缩
    if(fa[k]==k)return k;
    return fa[k]=find(fa[k]);
}
int main(){
    cin>>n>>m>>p;
    for(int i=1;i<=n;i++) fa[i]=i;//切记不能少,必须初始化每一个节点,不然后续全错
    while(m--){
        int mi,mj;
        cin>>mi>>mj;
        fa[find(mi)]=find(mj);//合并祖先
    }
    while(p--){
        int pi,pj;
        cin>>pi>>pj;
        if(find(pi)==find(pj))//查找是否是同一个祖先
            cout<<"Yes\n";
        else
            cout<<"No\n";
    }
    return 0;
}
posted @ 2026-05-24 13:41  Synthx  阅读(2)  评论(0)    收藏  举报