L2-024. 部落
问题分析
要用到并查集,将每个人按照相互关系分到相应的部落中,通过查找有几个不同的祖先来确定部落数,之后就是判断两人的祖先是否相同就可以了。
代码
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int father[100001];
int p[100001];
set<int> s;
int n;
int find(int x){
if(x != father[x])
father[x] = find(father[x]);
return father[x];
}
int main(){
cin >> n;
for(int i = 1; i <= 10000; i++)
father[i] = i;
for(int i = 0; i < n; i++){
int m;
cin >> m;
int num,nm;
cin >> nm;
s.insert(nm);
nm = find(nm);
for(int j = 1; j < m; j++){
cin >> num;
s.insert(num);
father[find(num)] = nm;
}
}
cout << s.size();
set<int> s2;
for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
s2.insert(find(*it));
}
cout << " " << s2.size() << endl;
int l;
cin >> l;
for(int i = 0;i < l; i++){
int a,b;
cin >> a >> b;
if(find(a) == find(b)){
cout << "Y" << endl;
}
else
cout << "N" << endl;
}
return 0;
}