题目传送门
前提紧要-并查集
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";elsecout<<"No\n";}return 0;
}
