算法思路
亲戚问题是并查集的经典问题,本质就是用根代表类,如果是在一类中,说明两者有关系;如果既在这类又在那类,就发生了逻辑错误。
#include<iostream>
#include <string.h>
#include<cstring>
#include<limits.h>
#include<vector>
#include<unordered_map>
#include<cstdlib>
using namespace std;
class unionfind{
vector<int> parent;
public:
unionfind(int n){
parent.resize(n);
for(int i=1;i<=n;i++) parent[i]=i;
}
int find(int index){
if(index==parent[index]) return index;
parent[index]=find(parent[index]); //每次都将新的父节点更新为根节点,即每查询1次,树高就变成1维
return parent[index];
}
void unite(int i1,int i2){
parent[find(i1)]=find(i2);//根节点间关系更新就好了
}
};
int main(){
int T;
cin>>T;
for(int i=0;i<T;i++){
int n,m;
cin>>n>>m;
unionfind uf(n+1);
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
uf.unite(u,v);
}
int q;
cin>>q;
for(int i=0;i<q;i++){
int u,v;
cin>>u>>v;
if(uf.find(u)==uf.find(v)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
cout<<endl;
}
}