L2-024 部落
题目描述

输入样例:
4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7
输出样例:
10 2
Y
N
思路
并查集,需要额外统计合法节点个数和并查集个数
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10101;
int f[N];
bool st[N];//一个人是否存在;
int cnt = 0, sum = 0;
int find(int x){
if(f[x]!=x) f[x] = find(f[x]);
return f[x];
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
for(int i=1;i<N;i++) f[i] = i;
int n; cin >> n;
while(n--)
{
int m; cin >> m;
int x; cin >> x;
if(!st[x]) {//是否已经计数过
st[x] = true;
sum++;
}
m--;
if(m==0) continue;
else{
while(m--){
int t; cin >> t;
t = find(t);
f[t] = find(x);
if(!st[t]) {
st[t] = true;
sum++;
}
}
}
}
for(int i=1;i<N;i++) if(st[i] && f[i]==i) cnt++; //计数部落个数
//for(int i=1;i<=10;i++) printf("f[%d] %d\n",i,f[i]);
cout<<sum<<" "<<cnt<<endl;
cin >> n;
while(n--)
{
int a, b; cin >> a >> b;
a = find(a), b = find(b);
if(a==b) cout<<"Y\n";
else cout<<"N\n";
}
return 0;
}

467

被折叠的 条评论
为什么被折叠?



