【PAT甲级】1118 Birds in Forest (25分)(并查集)

题意:

输入一个正整数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<<"\n";
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\n";
48         else
49             cout<<"No\n";
50     }
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/12373307.html