题解: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;
}

浙公网安备 33010602011771号