部落

题目详情 - 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 @   小志61314  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示