• acwing836. 合并集合


    一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

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

    1. M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
    2. Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;

    输入格式

    第一行输入整数 n 和 m。

    接下来 m 行,每行包含一个操作指令,指令为 M a bQ a b 中的一种。

    输出格式

    对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No

    每个结果占一行。

    数据范围

    1≤n,m≤105

    输入样例:

    4 5
    M 1 2
    M 3 4
    Q 1 2
    Q 1 3
    Q 3 4
    

    输出样例:

    Yes
    No
    Yes
    

    方法一:

    并查集模板题

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 100010;
    int n, m, p[N];
    
    // 返回x的祖宗 + 路径压缩
    int find(int x) {
        if (x != p[x]) p[x] = find(p[x]); // 让整条路径上的父亲都变成根节点
        return p[x];
    }
    
    int main() {
        int a, b;
        char c[2];
        scanf("%d%d", &n, &m);
    
        for (int i = 1; i <= n; ++i) {
            p[i] = i;
        }
    
        for (int i = 0; i < m; ++i) {
            scanf("%s%d%d", c, &a, &b);
            if (c[0] == 'M') p[find(a)] = find(b);
            else if (c[0] == 'Q') {
                if (find(a) == find(b)) puts("Yes");
                else puts("No");
            }
        }
    }
    
  • 相关阅读:
    Python常见问题
    经典SQL语句大全(转)
    VMware ESX常用命令
    每天一个linux命令(目录)
    Linux 技巧:让进程在后台可靠运行的几种方法(转)
    软件测试随手记(转)
    linux下查看磁盘空间
    MQ5.3在redhat9上的安装
    我的MQ笔记
    RedHat Linux下MQ安装步骤及MQ常用命令
  • 原文地址:https://www.cnblogs.com/nosae/p/15993819.html
Copyright © 2020-2023  润新知