首页 > 其他分享 >并查集

并查集

时间:2023-07-17 23:32:05浏览次数:72  
标签:int 查集 find 集合 Yes 节点 op

JWvFczgRNg.jpg

题目

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

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

M a b,将编号为 $a$ 和 $b$ 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; 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

思路

并查集可以在非常快的时间内完成以下操作:

  1. 将两个集合合并 ※
  2. 询问两个元素是否在同一集合中

基本原理:每个集合用树表示,每个节点x存储它的父节点p[x]

  1. 判断根节点:p[x] == x
  2. 求根节点:while (x != p[x]) x = p[x] 此时可以将路径上的点全部指向根节点优化时间
  3. 合并两个集合:将一个集合的根节点变为另一个树的根节点

代码

#include <iostream>

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 = 0; i < n; i ++ ) p[i] = i;  // 初始化父节点,初始为本身
    
    while (m -- )
    {
        char op;
        int a, b;
        cin >> op >> a >> b;
        if (op == 'Q')
        {
            if (find(a) == find(b)) puts("Yes");
            else puts("No");
        }
        else p[find(a)] = find(b);
    }
    
    return 0;
}

标签:int,查集,find,集合,Yes,节点,op
From: https://blog.51cto.com/u_16170343/6754656

相关文章

  • 并查集
    题目一共有$n$个数,编号是$1∼n$,最开始每个数各自在一个集合中。现在要进行$m$个操作,操作共有两种:Mab,将编号为$a$和$b$的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Qab,询问编号为$a$和$b$的两个数是否在同一个集合中;输入格式第一行输......
  • 并查集和带权并查集原理分析
    并查集是算法竞赛中常用的一种数据结构。它可以高效地处理集合之间的操作与询问。其主要功能是查询两个元素是否在同一个集合以及将两个集合合并。第一部分并查集的基本操作算法思想我们将所有元素建成很多棵树(森林),每一棵树就是一个集合。因为并查集是一个树结构,那么每......
  • 并查集笔记
    并查集导论并查集是一种数据结构,主要用于处理一些不相交集合的合并问题。一般应用在连通图、最小生成树、Kruskal算法、最近公共祖先(LCA)等算法中。举例用帮派例子理解并查集:在n个人中,分成了不同的帮派,每个帮派的人都互为朋友,朋友的朋友是朋友,例如1号和2号是朋友,1号和3号......
  • 【算法】并查集学习笔记
    1.并查集简介1.1什么是并查集并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。并查集支持两种操作:1.合并(merge):合并两个数所属的集合(合并两个树);2.查询(find):查询两个数是否在同一个集合中(查询两个数所对......
  • 并查集(Disjoint Set)
    并查集是算法竞赛中常用的一种数据结构。其主要功能是查询两个元素是否在同一个集合以及将两个集合合并。第一部分并查集的基本操作算法思想我们将所有元素建成很多树(森林),每一棵树就是一个集合,比如下图有\(\{1,2,3,4,5,6\},\{7,9,10,11,12,13\}\)两个集合。......
  • poj 2236 Wireless Network 并查集
    WirelessNetworkTimeLimit: 10000MSMemoryLimit: 65536KTotalSubmissions: 20499Accepted: 8608DescriptionAnearthquaketakesplaceinSoutheastAsia.TheACM(AsiaCooperatedMedicalteam)havesetupawirelessnetworkwiththelapcomputers,butanun......
  • poj 1182 食物链 并查集
    食物链TimeLimit:1000MSMemoryLimit:10000KTotalSubmissions:56297Accepted:16500Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种......
  • 【模板】并查集
    简介并查集是什么并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集其实就是一个树,如果要合并的话就将其中一个的根节点连接到另外一个的根......
  • P2024 [NOI2001] 食物链 || #576. 食物链【NOI2001】 (并查集)
    空降锣鼓空降OJ题解:#include<bits/stdc++.h>usingnamespacestd;intn,k;intd,x,y;intans;intfa[500050];intfind(intx){//找爸爸 if(fa[x]==x) returnfa[x]; returnfind(fa[x]);}intmain(){ cin>>n>>k; for(inti=1;i<=n*3;i++)//开三个并查集风......
  • #570. 【例4-8】格子游戏 (并查集)
    #570.【例4-8】格子游戏题题题题题题题题题题题题题题分析:并查集解决的是连通性(无向图连通分量)和传递性(家谱关系)问题,并且可以动态的维护。抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以将点分为若干个集合,每个集合对应图中的一个连通块......