L2-024 部落 (25 分)

并查集裸题。

const int N=10010;
int p[N];
int n,m,maxid;

int find(int x)
{
    if(x != p[x]) p[x]=find(p[x]);
    return p[x];
}

int main()
{
    cin>>n;

    for(int i=1;i<N;i++) p[i]=i;

    while(n--)
    {
        int k;
        cin>>k;
        vector<int> a(k);
        for(int i=0;i<k;i++) cin>>a[i],maxid=max(maxid,a[i]);

        for(int i=0;i<k-1;i++)
        {
            int pa=find(a[i]),pb=find(a[i+1]);
            if(pa != pb)
                p[pa]=pb;
        }
    }

    int group=0;
    for(int i=1;i<=maxid;i++)
        if(p[i] == i)
            group++;

    cout<<maxid<<' '<<group<<endl;

    cin>>m;
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        int pa=find(a),pb=find(b);
        if(pa != pb) puts("N");
        else puts("Y");
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14676950.html