题目描述
知识点: 并查集
思路: 简单并查集。
#include<iostream>
#include<set>
#include<vector>
using namespace std;
const int N = 1e4+10;
int p[N];
int find(int x){
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
set<int> count;
int main(){
int n;
cin>>n;
for(int i = 1;i < N;i++) p[i] = i;
while(n--){
int m;
cin>>m;
vector<int> bird;
while(m--){
int a;
cin>>a;
bird.push_back(a);
count.insert(a);
}
for(int i = 1;i < bird.size();i++){
int x = find(bird[i-1]);
int y = find(bird[i]);
p[x] = p[y];
}
}
int res = 0;
for(int i = 1;i <= count.size();i++){
if(p[find(i)] == i) res++;
}
cout<<res<<" "<<count.size()<<endl;
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
if(find(a) == find(b)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}