• AcWing 836. 合并集合


    地址  https://www.acwing.com/problem/content/838/

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

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

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

    输入格式

    第一行输入整数n和m。

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

    输出格式

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

    每个结果占一行。

    数据范围

    1n,m1051≤n,m≤105

    输入样例:
    4 5
    M 1 2
    M 3 4
    Q 1 2
    Q 1 3
    Q 3 4
    输出样例:
    Yes
    No
    Yes

    并查集 模板题目

    解答 

    #include <iostream>
    
    
    using namespace std;
    
    const int N = 100010;
    
    int arr[N] = {-1};
    
    
    int find(int n){
        if(arr[n] != n)
            arr[n] = find(arr[n]);
        return arr[n];
    }
    
    
    int main()
    {
        int n,m;
        
        cin >> n >> m;
        for (int i = 1; i <= n; i ++ ) arr[i] = i;
        while(m--){
            char op[2];
            int a, b;
            scanf("%s%d%d", op, &a, &b);
            if (*op == 'M') arr[find(a)] = find(b);
            else
            {
                if (find(a) == find(b)) puts("Yes");
                else puts("No");
            }
            
        }
        
    
        
        
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Oracle expdp 多表导出处理
    字符串
    Java设计模式
    多线程
    Java面向对象练习
    Java面向对象基础
    Java基础算法
    Java常识
    DOS基础命令(1)
    Java基础练习
  • 原文地址:https://www.cnblogs.com/itdef/p/11605158.html
Copyright © 2020-2023  润新知