合并集合--并查集()

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

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


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


C a b,在点 aa 和点 bb 之间连一条边,aa 和 bb 可能相等;

Q1 a b,询问点 aa 和点 bb 是否在同一个连通块中,aa 和 bb 可能相等;

Q2 a,询问点 aa 所在连通块中点的数量;


输入格式


第一行输入整数 nn 和 mm。


接下来 mm 行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。


输出格式


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


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


每个结果占一行。


数据范围


1≤n,m≤1051≤n,m≤105


输入样例:

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

输出样例:

Yes
2
3
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,m;
int p[N];
int find (int x)
{
    if(p[x]  != x )   p[x] = find(p[x]);   //父节点等于祖宗节点
    return p[x];
}
int main()
{
    cin>>n>>m;
    for(int i = 1;i <= n; i ++)  p[i] = i;    //根据题目要求使得每个数各自在一个集合
    while(m--)
    {
        char op[2];
        int a,b; 
        scanf("%s%d%d",op,&a,&b);  //输入字符串,因为scanf常常读入一些空格之类,使用字符串类型比较保险
        if(op[0] == 'M')   p[find(a)] = find(b);  //使a的祖宗节点的父节点等于b的父节点实现转接
        else 
        {   
           if(find(a) == find(b)) puts("Yes");
           else puts("No");
        }
    }
    return 0;
}


相关文章
|
7月前
集合中常见方法及遍历方式
集合中常见方法及遍历方式
42 1
|
7月前
|
Java 容器
07 Java数组与数组操作(定义+遍历+排序+增删改查)(上)
07 Java数组与数组操作(定义+遍历+排序+增删改查)
78 8
|
7月前
|
存储 Java API
07 Java数组与数组操作(定义+遍历+排序+增删改查)(下)
07 Java数组与数组操作(定义+遍历+排序+增删改查)
54 4
|
9月前
|
算法 Java
Java数据结构与算法:用于处理不相交集合的合并和查找问题
Java数据结构与算法:用于处理不相交集合的合并和查找问题
|
9月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
|
10月前
合并集合(并查集)
合并集合(并查集)
35 1
移除元素、合并两个有序数组(leetcode)
移除元素、合并两个有序数组(leetcode)
13.从入门到精通:Python 集合 集合的基本操作 1、添加元素 2、移除元素 3、计算集合元素个数 4、清空集合 5、判断元素是否在集合中存在 集合内置方法完整列表
13.从入门到精通:Python 集合 集合的基本操作 1、添加元素 2、移除元素 3、计算集合元素个数 4、清空集合 5、判断元素是否在集合中存在 集合内置方法完整列表
|
存储 算法 测试技术
LeetCode算法小抄--O(1)时间下删除-查找数组中任意元素
LeetCode算法小抄--O(1)时间下删除-查找数组中任意元素
合并两个链表(自定义位置合并与有序合并)LeetCode--OJ题详解
给两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中 下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点 的位置。
89 0