当前位置: 首页 > news >正文

并查集(竞赛)

一、模型建立

本质就是一个数组,数组的下标对应节点的编号,数组的值对应对应编号的节点的父节点。规定根节点的父节点是自己。

规定三个集合的根节点分别是1 4 6

二、并查集操作并实现

并查集主要操作:查找一个节点的父节点,判断两个节点是不是在一个集合,合并两个节点所在的两个集合。

这里的第二第三个操作是基于第一个查找父节点的,但是查找父节点的操作有一个路径优化,所以最后再讲。

1、判断两个节点是不是在一个集合

看看两个节点的父节点是不是相同就行了。

bool issame(int x, int y)
{
    return find(x) == find(y);
}

2、合并两个节点所在的两个集合

让两个节点的父节点合并,即一个父节点是另一个父节点的父节点。

void U(int x, int y)
{
    int root1 = find(x);
    int root2 = find(y);
    a[root1] = root2;
}

3、查找一个节点的父节点

根据数组特性,只要不是数值等于下标,那就不是父节点,还需要找数值的父节点,即找当前节点的父亲的父亲。

int find(int x)
{
    if (a[x] == x)
        return x;
    return find(a[x]);
}

但是如果一开始的结构是近似单支树,那么每次查找的效率就会降低成O(N)

路径压缩:在遍历到根节点之后,回溯时把回溯过程中经历到的孩子节点的父节点全部修改成根节点,这样就压缩成了2层。

int find(int x)
{
    if (a[x] == x)
        return x;
    // 路径压缩:根的后代的父节点直接改成根
    return a[x] = find(a[x]);
}

三、例题

P3367 【模板】并查集 - 洛谷

#include "bits/stdc++.h"
using namespace std;
const int N = 2 * 1e5 + 10;
int a[N];
// 查找
int find(int x)
{
    if (a[x] == x)
        return x;
    // 路径压缩:根的后代的父节点直接改成根
    return a[x] = find(a[x]);
}
// 合并
void U(int x, int y)
{
    int root1 = find(x);
    int root2 = find(y);
    a[root1] = root2;
}

// 判断
bool issame(int x, int y)
{
    return find(x) == find(y);
}

int main()
{
    int n, m;
    cin >> n >> m;
    // 1.初始化所有点是单独一个集合,根是自己
    for (int i = 1; i <= n; i++)
        a[i] = i;
    while (m--)
    {
        int op, x, y;
        cin >> op >> x >> y;
        if (op == 1)
            U(x, y);
        else
            issame(x, y) == true ? cout << "Y" << endl : cout << "N" << endl;
    }
    return 0;
}

相关文章:

  • 生活电子类常识——搭建openMauns工作流+搭建易犯错解析
  • STM32单片机uCOS-Ⅲ系统10 内存管理
  • visual studio code 开发STM32步骤
  • 使用Python开发智能家居系统:基于语音命令的设备控制
  • 常⻅中间件漏洞--Tomcat
  • 深度解析 BPaaS:架构、原则与研发模式探索
  • 《Operating System Concepts》阅读笔记:p471-p472
  • Python常用库全解析:从数据处理到机器学习
  • leetcode0560. 和为 K 的子数组-medium
  • fatal: Unable to create /.git/index.lock‘: File exists.
  • WRC世界机器人大会-2024年展商汇总
  • 可发1区的创新思路:​基于K-means聚类的EMD-BiLSTM-CNN-Attention时间序列预测模型(功率预测、寿命预测、流量预测、故障诊断)
  • 链表相关知识总结
  • HTML:form表单简单介绍
  • 神经网络监督、半监督、无监督学习解析
  • 基于springboot的星之语明星周边产品销售网站(050)
  • LeetCode热题100精讲——Top3:最长连续序列【哈希】
  • 数的划分(dfs)
  • OpenCV图像拼接项目指南
  • 健康养生:铺就活力生活之路
  • 中国金茂向滨江集团提供11.21亿元诚意金借款,拟合作开发3月获取的地块
  • 当农民跨进流动的世界|劳动者的书信①
  • 全国人民代表大会常务委员会公告〔十四届〕第十号
  • 奈雪的茶叫停“能喝奶茶就不要喝水”宣传,当地市监称不要误导消费者
  • 国家卫健委有关负责人就白皮书发布答记者问
  • 工业富联一季度净利增长25%,云计算业务营收增长超50%