https://www.patest.cn/contests/gplt/L2-024
其实是简单并查集,太久没做都忘了。
#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
int fa[maxn];
int cnt[maxn];
void init(){
for (int i=1;i<=10000;i++){
fa[i]=i;
}
}
int find(int x){
if (x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void unite(int x,int y){
x=find(x);
y=find(y);
if (x==y) return;
fa[y]=x;
}
bool same(int x,int y){
return find(x)==find(y);
}
int main(){
init();
int n;
cin >> n;
for (int i=0;i<n;i++){
int k;
cin >> k;
int a;
cin >> a;
cnt[a]=1;
for (int j=1;j<k;j++){
int b;
cin >> b;
cnt[b]=1;
unite(a,b);
}
}
int sum1=0,sum2=0;
for (int i=1;i<=10000;i++){
if (cnt[i]){
sum1++;
if (fa[i]==i) sum2++;
}
}
cout << sum1 << " " << sum2 ;
cin >> n;
for (int i=0;i<n;i++){
int x,y;
cin >> x >>y;
if (same(x,y)){
cout << "Y" << endl;
}
else{
cout << "N" << endl;
}
}
}