1118 Birds in Forest(25 分)

并查集,把每个照片的第一个鸟作为合并的第一个

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 1e5 + 10;
int father[maxn];
set<int>bird;
bool isroot[maxn];
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 Union(int a, int b)
{
    int fa = findfather(a);
    int fb = findfather(b);
    if (fa != fb)
    {
        father[fa] = fb;
    }
}
int maxb = 0;
int main()
{
    int n;
    for (int i = 0; i < maxn; i++)father[i] = i;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        int k, b;
        scanf("%d", &k);
        int x;
        scanf("%d", &x);
        k--;
        bird.insert(x);
        maxb = max(maxb, x);
        while (k--)
        {
            scanf("%d", &b);
            Union(x, b);
            bird.insert(b);
            maxb = max(maxb, b);
        }
    }
    for (int i = 1; i <= maxb; i++)
    {
        isroot[findfather(i)] = true;
    }
    int root = 0;
    for (int i = 1; i <= maxb; i++)root += isroot[i];
    printf("%d %d\n", root, bird.size());
    int q;
    scanf("%d", &q);
    while (q--)
    {
        int b1, b2;
        scanf("%d%d", &b1, &b2);
        if (findfather(b1) == findfather(b2))printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 此时游曳在西电的校园,望以这种无目的的消遣打发一些午时的时间,尽管我已经感觉到寒冷,但我仍不能归去,实际...
    sinlife阅读 1,787评论 0 0
  • 我喜欢你安静的样子。 就像有些文字,只能阅,不能读。 2015.8.24
    一盒子一阅读 2,383评论 0 0
  • 每天被禁锢在那几平米,杀气腾腾。。。倒也修炼了,乐哉乐哉。偶得清静跟小姐姐们聊个私房话,爱了,散了,总也脱离不了那...
    威侯阅读 3,682评论 0 0
  • 一个阳光并不明媚的中午,与老同学共进午餐。本科毕业的我已经工作6年,来到第三家公司已经快2年的时间。老同学研究生毕...
    花腔书生阅读 4,276评论 4 5