zoukankan      html  css  js  c++  java
  • [并查集] 1118. Birds in Forest (25)

    1118. Birds in Forest (25)

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in the same picture belong to the same tree. You are supposed to help the scientists to count the maximum number of trees in the forest, and for any pair of birds, tell if they are on the same tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive number N (<= 104) which is the number of pictures. Then N lines follow, each describes a picture in the format:
    K B1 B2 ... BK
    where K is the number of birds in this picture, and Bi's are the indices of birds. It is guaranteed that the birds in all the pictures are numbered continuously from 1 to some number that is no more than 104.

    After the pictures there is a positive number Q (<= 104) which is the number of queries. Then Q lines follow, each contains the indices of two birds.

    Output Specification:

    For each test case, first output in a line the maximum possible number of trees and the number of birds. Then for each query, print in a line "Yes" if the two birds belong to the same tree, or "No" if not.

    Sample Input:
    4
    3 10 1 2
    2 3 4
    4 1 5 7 8
    3 9 6 4
    2
    10 5
    3 7
    
    Sample Output:
    2 10
    Yes
    No
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    const int maxn=1e4+20;
    
    int father[maxn];
    int num[maxn]={0};
    int flag[maxn]={0};
    
    int findFather(int x)
    {
        int a=x;
        while(x!=father[x])
        {
            x=father[x];
        }
        //路径压缩
        while(a!=father[a])
        {
            int z=a;
            a=father[a];
            father[z]=x;
        }
        return x;
    }
    
    void uf(int a,int b)
    {
        int fa=findFather(a);
        int fb=findFather(b);
        if(fa!=fb)
        {
            father[fa]=fb;
            num[fa]+=num[fb];
        }
    }
    
    
    int max_num=0;
    int ans=0;
    
    int main()
    {
        for(int i=0;i<maxn;i++) father[i]=i;
        fill(num,num+maxn,1);
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            int k,first;
            scanf("%d %d",&k,&first);
            flag[first]=1;
            max_num=first>max_num?first:max_num;
            for(int j=1;j<k;j++)
            {
                int a;
                scanf("%d",&a);
                flag[a]=1;
                max_num=max_num>a?max_num:a;
                uf(a,first);
            }
        }
        int cnt=0;
        for(int i=1;i<=max_num;i++)
        {
            //printf(" %d",father[i]);
            if(father[i]==i) cnt++;
        }
        for(int i=1;i<maxn;i++) ans+=flag[i];
        printf("%d %d
    ",cnt,ans);
        int q;
        scanf("%d",&q);
        for(int i=0;i<q;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            if(findFather(u)==findFather(v))
            {
                printf("Yes
    ");
            }
            else
            {
                printf("No
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Xshell安装教程及Xshell安装程序集组件时出错的解决方法
    Xshell远程连接的具体操作和Xshell多会话设置小技巧
    VMware中出现物理内存不足,无法使用配置的设置开启虚拟机解决方案
    在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)
    Sublime Text编辑器配置Python解释器简易教程
    虚拟机创建后该如何获取IP地址并访问互联网实用教程
    关于Scrapy爬虫项目运行和调试的小技巧(下篇)
    Spring的xml和注解对比
    Spring5.X的注解配置项目
    Spring的AOP快速实现通用日志打印
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6474670.html
Copyright © 2011-2022 走看看