1118 Birds in Forest (25 分)【难度: 一般 / 知识点: 并查集】

在这里插入图片描述
https://pintia.cn/problem-sets/994805342720868352/problems/994805354108403712

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int p[N],n,q;
unordered_map<int,int>cnt;
int find(int x)
{
    
    
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
int main(void)
{
    
    
    cin>>n;
    for(int i=0;i<N;i++) p[i]=i;
    for(int i=0;i<n;i++)
    {
    
    
        int m; cin>>m;
        int a[105];
        for(int j=0;j<m;j++)
        {
    
    
            cin>>a[j];
            if(j) p[find(a[j])]=find(a[j-1]);
            cnt[a[j]]++;
        }
    }
    int ans1=0,ans2=0;
    for(int i=0;i<N;i++) 
    {
    
    
        if(cnt[i]&&i==p[i]) ans1++;//点存在,且是根节点
        if(cnt[i]) ans2++;
    }
    cout<<ans1<<" "<<ans2<<endl;
    cin>>q;
    while(q--)
    {
    
    
        int a,b; cin>>a>>b;
        if(find(a)!=find(b)) puts("No");
        else puts("Yes");
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_46527915/article/details/121455900