题意:
输入一个正整数N(<=10000),接着输入N行数字每行包括一个正整数K和K个正整数,表示这K只鸟是同一棵树上的。输出最多可能有几棵树以及一共有多少只鸟。接着输入一个正整数Q,接着输入Q行每行包括两个正整数,输出它们是否在同一棵树上。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int fa[10007]; 5 int vis[10007]; 6 int find_(int x){ 7 if(x==fa[x]) 8 return x; 9 return fa[x]=find_(fa[x]); 10 } 11 int main(){ 12 ios::sync_with_stdio(false); 13 cin.tie(NULL); 14 cout.tie(NULL); 15 int n; 16 cin>>n; 17 for(int i=1;i<=10000;++i) 18 fa[i]=i; 19 for(int i=1;i<=n;++i){ 20 int k; 21 cin>>k; 22 int temp=0; 23 for(int j=1;j<=k;++j){ 24 int x; 25 cin>>x; 26 vis[x]=1; 27 int f=find_(x); 28 if(j==1) 29 temp=f; 30 fa[f]=temp; 31 } 32 } 33 int cnt=0; 34 int sum=0; 35 for(int i=1;i<=10000;++i) 36 if(fa[i]==i&&vis[i]) 37 ++cnt; 38 else if(vis[i]) 39 ++sum; 40 cout<<cnt<<" "<<cnt+sum<<" "; 41 int q; 42 cin>>q; 43 while(q--){ 44 int a,b; 45 cin>>a>>b; 46 if(find_(a)==find_(b)) 47 cout<<"Yes "; 48 else 49 cout<<"No "; 50 } 51 return 0; 52 }