837. 连通块中点的数量

摘要
Title: 837. 连通块中点的数量
Tag: 并查集
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

837. 连通块中点的数量

  • 题意

    给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。
    现在要进行 m 个操作,操作共有三种:
    C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;
    Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;
    Q2 a,询问点 a 所在连通块中点的数量;

  • 思路

    新建一个size数组,表示集合中点的数量
    注意:

    • 只有根节点的size值是有意义的
    • 当两个根合并时,若a连向b,则b的大小加上a的大小
      • 当a和b在同一个集合时,不进行size相关操作
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    '''
    Author: NEFU AB-IN
    Date: 2022-03-01 18:40:18
    FilePath: \ACM\Acwing\837.py
    LastEditTime: 2022-03-01 19:09:25
    '''
    N = int(1e5 + 10)

    fa = [_ for _ in range(N)]
    size = [1 for _ in range(N)] #全部初始化1


    def find(x):
    if fa[x] != x:
    fa[x] = find(fa[x])
    return fa[x]


    n, m = map(int, input().split())
    for i in range(m):
    lst = input().split()
    if lst[0] == 'C':
    a, b = int(lst[1]), int(lst[2])
    if find(a) == find(b): # 需continue
    continue
    size[find(b)] += size[find(a)]
    fa[find(a)] = find(b)
    elif lst[0] == 'Q1':
    a, b = int(lst[1]), int(lst[2])
    if find(a) == find(b):
    print("Yes")
    else:
    print("No")
    else:
    a = int(lst[1])
    print(size[find(a)])

使用搜索:谷歌必应百度