#include<iostream>
#include<numeric>
using namespace std;
int N, M, K,L;
const int maxn = 10010;
bool exist[maxn];
int fa[maxn] = { 0 }, cnt[maxn] = { 0 };
int findFather(int x)
{
int a = x;
while (x!=fa[x])
{
x = fa[x];
}
while (a!=fa[a])//互相交换值
{
int z = a;
a = fa[a];
fa[z] = x;
}
return x;
}
void Union(int a, int b)
{
int faA = findFather(a);
int faB = findFather(b);
if (faA!=faB)
{
fa[faA] = faB;
}
}
int main()
{
cin >> N;
iota(fa, fa+maxn, 0);
int id, temp;
for (int i = 0; i < N; i++)
{
cin >> K >> id;
exist[id] = true;
for (int j = 0; j < K-1; j++)
{
cin >> temp;
Union(id, temp);
exist[temp] = true;
}
}
for (int i = 1; i < maxn; i++)
{
if (exist[i]==true)
{
int root = findFather(i);
cnt[root]++;
}
}
int numtrees = 0, numbirds = 0;
for (int i = 0; i < maxn; i++)
{
if (exist[i] == true && cnt[i]!= 0)
{
numtrees++;
numbirds += cnt[i];
}
}
cout << numtrees << " " << numbirds << endl;
cin >> L;
int ida, idb;
for (int i = 0; i < L; i++)
{
cin >> ida >> idb;
if (findFather(ida)==findFather(idb))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
}
网友评论