PAT-甲级-1118 Birds in Forest (25 分)

本文深入探讨了一种基于并查集的鸟类群集算法实现,通过使用C++编程语言,详细解释了如何处理森林中鸟类之间的关系,包括如何构建并查集,查找根节点,以及合并不同鸟类群体的过程。文章提供了完整的代码示例,展示了算法的高效性和实用性。

1118 Birds in Forest (25 分)

#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#define rep(i,j,k)    for(int i=j;i<k;i++)
using namespace std;
const int maxn=1e4+10;
int fa[maxn];
int find(int x){
    int a = x;
    while(x != fa[x]){
        x = fa[x];
    }
    while(a != fa[a]){
        int z = a;
        a = fa[a];
        fa[z] = x;
    }
    return x;
}

void uni(int a,int b){
    int faa=find(a);
    int fab=find(b);
    if(faa < fab)
        fa[fab] = faa;
    else if(faa > fab)
        fa[faa] = fab;
}

int main(){
    int n,m,k,a,b;
    cin>>n;
    rep(i,0,10000){
        fa[i] = i;
    }
    set<int> st,ma;
    rep(i,0,n){
        cin>>k>>a;
        st.insert(a);
        rep(j,1,k){
            cin>>b;
            st.insert(b);
            uni(a,b);
        }
    }
    for(set<int>::iterator it=st.begin();it!=st.end();it++){
        ma.insert(fa[*it]);
    }
    printf("%d %d\n",ma.size(),st.size());
    cin>>m;
    rep(i,0,m){
        cin>>a>>b;
        printf("%s\n",find(a)==find(b)?"Yes":"No");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值