Acwing---837. 连通块中点的数量

连通块中点的数量

1.题目

给定一个包含 n n n个点(编号为 1 ∼ n 1∼n 1n)的无向图,初始时图中没有边。

现在要进行 m m m 个操作,操作共有三种:

  1. C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;
  2. Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;
  3. Q2 a,询问点 a 所在连通块中点的数量;

输入格式
第一行输入整数 n n n m m m

接下来 m m m 行,每行包含一个操作指令,指令为 C a bQ1 a bQ2 a 中的一种。

输出格式
对于每个询问指令 Q1 a b,如果 a a a b b b 在同一个连通块中,则输出 Yes,否则输出 No

对于每个询问指令 Q2 a,输出一个整数表示点 a a a 所在连通块中点的数量

每个结果占一行。

数据范围
1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1n,m105

输入样例:

5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5

输出样例:

Yes
2
3

2.基本思想

因为与合并题目中唯一不同的是,多了记录合并集合中连通块的个数
通过size数组记录以当前点x为祖先节点的集合中的连通块个数

for(int i = 0; i <= n; i ++) {
    p[i] = i;
    //用祖先节点记录当前合并集合的size
    size[i] = 1;
}

初始化,让自己指向自己,同时标记自己为祖先节点下,有多少个连通块,初始为1
在这里插入图片描述
显然,将1,5合并
find(1) = 3 find(5) = 4
p[3] = 4
这时候有8个点相连接
合并的数目更新方式:
size[3] = 4 以3为根节点下有4个连通块
size[4] = 4 以4为根节点下有4个连通块
更新4节点的连通块情况
size[4] = size[4] + size[3] = 8

3.代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
   
    static int N = 100010;
    static int[] size = new int[N], p = new int[N];


    public static void main(String[] args) throws IOException {
   
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        int n = Integer.parseInt(s[0]);
        for (int i = 0; i < n; i++) {
   
            p[i] = i;//最开始 初始化
            size[i] = 1;
        }
        int m = Integer.parseInt(s[1]);

        while (m-- > 0) {
   //m 次操作
            String[] s1 = br.readLine().split(" ");
            String opt = s1[0];
            if (opt.equals("C")) {
   
                int a = Integer.parseInt(s1[1]), b = Integer.parseInt(s1[2]);
                if (find(a)==find(b)) continue;
                size[find(b)] += size[find(a)];
                p[find(a)] = find(b);
            } else if (opt.equals("Q1")) {
   
                int a = Integer.parseInt(s1[1]), b = Integer.parseInt(s1[2]);
                System.out.println(find(a) == find(b) ? "Yes" : "No");
            } else if (opt.equals("Q2")) {
   
                int a = Integer.parseInt(s1[1]);
                System.out.println(size[find(a)]);
            }
        }
    }

    private static int find(int x) {
   
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }
}

相关推荐

  1. Oracle数据数据事务槽SCN

    2024-02-11 03:10:01       32 阅读
  2. Oracle数据数据SCN

    2024-02-11 03:10:01       32 阅读
  3. AcWing.873.欧拉函数

    2024-02-11 03:10:01       45 阅读
  4. Acwing---835. Trie字符串统计

    2024-02-11 03:10:01       39 阅读
  5. 最大连通

    2024-02-11 03:10:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-11 03:10:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-11 03:10:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-11 03:10:01       82 阅读
  4. Python语言-面向对象

    2024-02-11 03:10:01       91 阅读

热门阅读

  1. Python进阶:标准库

    2024-02-11 03:10:01       47 阅读
  2. CSS3简介

    2024-02-11 03:10:01       51 阅读
  3. 不同类型的 I/O 实现方式和组件

    2024-02-11 03:10:01       54 阅读
  4. 数据库隔离级别的选择与实现

    2024-02-11 03:10:01       54 阅读
  5. 扩展说明: 指令微调 Llama 2

    2024-02-11 03:10:01       43 阅读
  6. minio: expand decommission pools in argocd

    2024-02-11 03:10:01       37 阅读
  7. Linux 命令行的世界 :2.文件系统中跳转

    2024-02-11 03:10:01       52 阅读
  8. c#进程(Process)常用方法

    2024-02-11 03:10:01       39 阅读
  9. Spring框架常见的注解Spring、SpringMVC、SpringBoot)

    2024-02-11 03:10:01       48 阅读
  10. limit深度分页和优化思路

    2024-02-11 03:10:01       55 阅读
  11. 鸿蒙学习-app.json5配置文件

    2024-02-11 03:10:01       53 阅读
  12. 任意IOS16系统iPad/Iphone开启台前调度

    2024-02-11 03:10:01       99 阅读