zoukankan      html  css  js  c++  java
  • PAT L2-024 部落

    https://pintia.cn/problem-sets/994805046380707840/problems/994805056736444416

    在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。

    输入格式:

    输入在第一行给出一个正整数N(≤),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:

    ⋯ [

    其中K是小圈子里的人数,[(,)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过1。

    之后一行给出一个非负整数Q(≤),是查询次数。随后Q行,每行给出一对被查询的人的编号。

    输出格式:

    首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出Y,否则输出N

    输入样例:

    4
    3 10 1 2
    2 3 4
    4 1 5 7 8
    3 9 6 4
    2
    10 5
    3 7
    

    输出样例:

    10 2
    Y
    N

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int N;
    int f[maxn];
    
    void init() {
        for(int i = 1; i <= maxn; i ++)
            f[i] = i;
    }
    
    int Find(int x) {
        if(x != f[x]) f[x] = Find(f[x]);
        return f[x];
    }
    
    void Merge(int x, int y) {
        int fx = Find(x);
        int fy = Find(y);
    
        if(fx != fy)
            f[fy] = fx;
    }
    
    int main() {
        init();
        scanf("%d", &N);
        int cnt = 0, ans = 0;
        for(int i = 0; i < N; i ++) {
            int K, x;
            scanf("%d", &K);
            if(K == 1) {
                scanf("%d", &x);
                cnt = max(cnt, x);
            } else {
                int st;
                for(int k = 0; k < K; k ++) {
                    scanf("%d", &x);
                    cnt = max(x, cnt);
                    if(k == 0) st = x;
                    else Merge(st, x);
                }
            }
        }
    
        for(int i = 1; i <= cnt; i ++)
            if(f[i] == i) ans ++;
    
        printf("%d %d
    ", cnt, ans);
    
        int Q;
        scanf("%d", &Q);
        while(Q --) {
            int a, b;
            scanf("%d%d", &a, &b);
            if(Find(a) == Find(b)) printf("Y
    ");
            else printf("N
    ");
        }
    
        return 0;
    }
    

      并查集 cnt 记录一共有多少人 每次把后面的人和第一个人并起来

  • 相关阅读:
    岩石圈
    地球及其圈层结构
    如何请教一个技术问题
    中国游戏路在何方?
    5.4删除二叉搜索树的任意元素
    5.3 删除二叉搜索树的最大元素和最小元素
    uni-app开发小程序准备阶段
    5.2二叉搜索树遍历(前序、中序、后序、层次、广度优先遍历)
    5.1二叉搜索树基础
    【loj
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10605264.html
Copyright © 2011-2022 走看看