很简单的并查集,但是测试数据3,4tle到自闭,在输入的数据的时候不要把他用数组存取了否则会tle
#include <iostream>
#include <set>
#include <vector>
using namespace std;
const int MAXN=11111;
set<int>st;
vector<int> vt;
int num[MAXN];
int find(int x)
{
while(num[x]!=x)
x=num[x];
return x;
}
void un(int a,int b)
{
int x=find(a);
int y=find(b);
if(x<y)
num[y]=x;
else num[x]=y;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<MAXN;i++)
num[i]=i;
for(int i=0;i<n;i++)
{
int k1,k2;
cin>>k1;
cin>>k2;
st.insert(k2);
for(int j=1;j<k1;j++)
{
int k;
cin>>k;
st.insert(k);
un(k2,k);
}
}
int m;
cin>>m;
int cont1=0;
for(int i=0;i<MAXN;i++)
if(num[i]==i&&st.find(i)!=st.end())
cont1++;
cout<<st.size()<<" "<<cont1<<endl;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
if(find(x)==find(y)) puts("Y");
else puts("N");
}
return 0;
}