题目
思路
并查集
代码
#include <iostream>
#include <cstring>
#include <stack>
#include <algorithm>
#include <queue>
#include <map>
#define MAXX 10100
using namespace std;
int n,m,num;
int fa[MAXX];
int vis[MAXX];
int find(int x)
{
if (fa[x] != x)
fa[x] = find(fa[x]);
return fa[x];
}
void merge(int x,int y)
{
int fx = find(x);
int fy = find(y);
if (fx != fy)
fa[fy] = fx;
}
int main()
{
cin>>n;
for (int i = 0; i <= 10050; ++i)
{
fa[i] = i;
}
memset(vis,0,sizeof vis);
while (n--)
{
int x,y;
cin>>x>>y;
vis[y] = 1;
x--;
while (x--)
{
int t;
cin>>t;
vis[t] = 1;
merge(y,t);
}
}
int cnt = 0;
for (int i = 0; i < 10010; ++i)
{
if (vis[i]==1)
cnt++;
}
int ans = 0;
for (int i = 1; i <= cnt; ++i)
{
if (fa[i]==i)
ans++;
}
cout<<cnt<<' '<<ans<<endl;
int m;
cin>>m;
while (m--)
{
int x,y;
cin>>x>>y;
if (find(x) == find(y)) //其实只需要把这里改成find就行,之前一直用的是fa数组
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
return 0;
}