部落

题目详情 - 7-2 部落 (25 分) (pintia.cn)

给很多个部落,然后这些部落是连通的,也就是一个连通块,求部落的人数和不相交的部落数量和判断两个人在不在一个部落里面

这个很典型的并查集

并查集 - 小志61314 - 博客园 (cnblogs.com)

下面的代码有路径压缩,合并,查找和求连通块的个数

#include<iostream>
#include<set>
using namespace std;
const int N=1e4+10;
int p[N];
int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
} 
void merge(int x,int y)
{
    int xx=find(x);
    int yy=find(y);
    if(xx!=yy) p[xx]=yy; 
}
int main(){
    set<int> q;
    int n;
    for(int i=1;i<=10000;i++) p[i]=i;//初始化 
    cin>>n;
    while(n--)
    {
        int m,x,t;
        cin>>m;
        cin>>x;
        q.insert(x);//找一个作为参照 
        for(int i=2;i<=m;i++)
        {
            cin>>t;
            merge(t,x);
            q.insert(t);
        }
    }
    int sum=0;
    for(int i=1;i<=q.size();i++)//求连通块的数量,也就是不相交的个数 
        if(p[i]==i)
            sum++;
    cout<<q.size()<<" "<<sum<<endl;
    int Q;
    cin>>Q;
    while(Q--)
    {
        int a,b;
        cin>>a>>b;
        if(find(a)==find(b)) cout<<"Y"<<endl;//查找 
        else cout<<"N"<<endl;
    }
    return 0;
}

 

posted @ 2022-03-31 19:12  小志61314  阅读(113)  评论(0)    收藏  举报