PAT 甲级 1118(Birds in Forest)

题目要求

Alt

翻译

一幅画里面的鸟为同一棵树上的,问有多少棵树和多少只鸟,以及对于两只鸟判断是否在同一个树上。

代码

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
set<int> ids;
int Rank[10010],parent[10010];
void init()
{
    for(int i=0;i<10010;i++)
    {
        parent[i]=i;
    }
    memset(Rank,0,sizeof(int));
}
int find(int p)
{
    while (p!=parent[p])
    {
        parent[p]= parent[parent[p]];
        p=parent[p];
    }
    return p;
}
void Union(int p,int q)
{
    int proot=find(p),qroot=find(q);
    if(proot==qroot) return;
    if(Rank[proot]>Rank[qroot]){
        parent[qroot]=proot;
    }else if(Rank[proot]<Rank[qroot]){
        parent[proot]=qroot;
    }else
    {
        parent[qroot]=proot;
        Rank[qroot]++;
    }
}
int main()
{
    init();
    int n;
    cin>>n;
    for(int i=0,k;i<n;i++)
    {
        scanf("%d",&k);
        int b,tmp;
        for(int j=0;j<k;j++)
        {
            scanf("%d",&b);
            ids.insert(b);
            if(j!=0) Union(tmp,b);
            tmp=b;
        }
    }
    vector<int> tmp[10010];
    set<int> s;
    for(int id:ids){
        int temp=find(id);
        s.insert(temp);
        tmp[temp].emplace_back(id);
    }
    printf("%d %d\n",s.size(),ids.size());
    scanf("%d",&n);
    while (n--)
    {
        int i,j;
        scanf("%d %d",&i,&j);
        if(find(i)==find(j)) printf("Yes\n");
        else
        {
            printf("No\n");
        }
    }
    system("pause");
}

思路

同样需要用到并查集。
可以将找到的父节点放到集合,或者vector中,放进去的数量就是多少棵树;
将所有节点放到集合中,有多少数量就是多少鸟;
判断是否在同一棵树就很简单了,只要find就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值