并查集——AcWing 239. 奇偶游戏

目录

并查集

定义

运用情况

注意事项

解题思路

AcWing 239. 奇偶游戏

题目描述

运行代码

代码思路

改进思路

并查集

定义

并查集(Disjoint Set Union,简称DSU),是一种树形的数据结构,常用于处理一些不交集的合并及查询问题。在并查集中,元素被分成多个不相交的集合,每个集合由一个代表元素表示,通过一系列的合并(Union)和查找(Find)操作来维护这些集合的状态。

运用情况

  1. 连通性问题:判断两个元素是否属于同一个集合,常用于图的连通分量问题。
  2. 动态连接问题:在元素集合之间建立连接,同时保持快速查询元素间的连接状态。
  3. 最小生成树:Kruskal算法中用于检测边加入后是否形成环路。
  4. 游戏算法:如迷宫生成、棋盘类游戏等,判断区域的联通性。

注意事项

  1. 路径压缩:为了提高查找效率,可以使用路径压缩技术,使得每次查找后路径上的所有节点都直接指向根节点。
  2. 按秩合并:在合并两个集合时,将秩较小的集合的根节点作为较大集合的子节点,可以保持树的平衡,降低树的高度,从而加快查找速度。
  3. 内存管理:并查集的数组通常会占用较大的空间,需要合理规划内存使用,特别是在大规模数据处理中。

解题思路

  1. 初始化:为每个元素创建一个单独的集合,并且每个元素都是其所在集合的根节点。
  2. 查找(Find):找到某个元素所在集合的代表元素,一般使用递归或迭代实现。
  3. 合并(Union):将两个集合合并成一个集合,通常选择一个集合的根节点作为新集合的根节点。

AcWing 239. 奇偶游戏

题目描述

239. 奇偶游戏 - AcWing题库

运行代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;

const int N = 20010;

int n, m;
int p[N], d[N];
unordered_map<int, int> S;

int get(int x)
{
    if (S.count(x) == 0) S[x] = ++ n;
    return S[x];
}

int find(int x)
{
    if (p[x] != x)
    {
        int root = find(p[x]);
        d[x] ^= d[p[x]];
        p[x] = root;
    }
    return p[x];
}

int main()
{
    cin >> n >> m;
    n = 0;

    for (int i = 0; i < N; i ++ ) p[i] = i;

    int res = m;
    for (int i = 1; i <= m; i ++ )
    {
        int a, b;
        string type;
        cin >> a >> b >> type;
        a = get(a - 1), b = get(b);

        int t = 0;
        if (type == "odd") t = 1;

        int pa = find(a), pb = find(b);
        if (pa == pb)
        {
            if (d[a] ^ d[b] != t)
            {
                res = i - 1;
                break;
            }
        }
        else
        {
            p[pa] = pb;
            d[pa] = d[a] ^ d[b] ^ t;
        }
    }

    cout << res << endl;

    return 0;
}

代码思路

  1. 初始化

    • 使用 unordered_map 存储每个节点映射到的唯一ID,这样可以处理任意数量的节点,而不仅仅是从0开始编号的连续整数。
    • n 和 m 分别代表节点的数量和边的数量,但实际中 n 在运行时动态增加。
    • 每个节点的父节点 p[i] 初始化为其自身,表示它们各自构成独立的集合。
    • d[i] 数组存储从节点 i 到其根节点路径上的“奇偶”属性,初始值为0。
  2. 读取输入

    • 读取边的数量 m 和节点间的连接信息。
    • 对于每条边,获取或分配节点的ID,读取边的类型(奇数或偶数)。
  3. 并查集操作

    • 对于每条边,检查两个节点是否已经在同一集合中,如果是,则检查它们之间的“奇偶”属性是否符合当前边的类型。
    • 如果不符合,则提前终止并输出矛盾发生的边序号减一。
    • 如果两个节点不在同一集合中,执行合并操作,更新父节点和“奇偶”属性。
  4. 输出结果:输出最后一次有效的边序号或者如果发现矛盾则输出矛盾前的边序号。

改进思路

  1. 减少哈希查找:目前 get 函数每次都会检查 unordered_map 是否包含键,这会导致额外的时间开销。可以通过预处理所有节点的映射,减少运行时的哈希查找次数。

  2. 空间优化unordered_map 在最坏情况下可能导致较高的空间开销。如果节点编号是连续的,可以考虑使用线性数组代替哈希表。

  3. 并查集优化:虽然代码中没有明确展示,但可以通过按秩合并和路径压缩来进一步优化并查集的性能。

  4. 预处理节点映射:在读取边之前,先读取所有节点,为它们分配ID,并存储在一个数组中,之后不再使用 unordered_map

  5. 空间优化:如果节点编号是连续的,使用数组替代 unordered_map 来存储节点ID映射。

  6. 并查集性能改进:在 find 函数中添加路径压缩逻辑,确保每次查找后路径上的所有节点都直接指向根节点,这可以显著减少未来查找的深度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/797481.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jvm 07 GC算法,内存池

01 垃圾判断算法 1.1引用计数算法 最简单的垃圾判断算法。在对象中添加一个属性用于标记对象被引用的次数&#xff0c;每多一个其他对象引用&#xff0c;计数1&#xff0c; 当引用失效时&#xff0c;计数-1&#xff0c;如果计数0&#xff0c;表示没有其他对象引用&#xff0c;…

一文详解DDL同步及其应用场景

目录 一、什么是DDL&#xff1f; 二、什么是DDL同步&#xff1f; 三、DDL同步的痛点 1、缺少自动DDL同步机制 2、缺少DDL变更监测预警 四、解决方案 五、应用场景及案例 案例一 案例二 案例三 在现代数据管理中&#xff0c;数据库的结构变更频繁且不可避免&#xff0c;特别是在…

计算机视觉之Vision Transformer图像分类

Vision Transformer&#xff08;ViT&#xff09;简介 自注意结构模型的发展&#xff0c;特别是Transformer模型的出现&#xff0c;极大推动了自然语言处理模型的发展。Transformers的计算效率和可扩展性使其能够训练具有超过100B参数的规模空前的模型。ViT是自然语言处理和计算…

卑微的LDAR第三方检测公司该如何应对政府强制使用LDAR系统

最近两年各个地方环保局和园区都再上LDAR管理系统&#xff0c;本来上系统是好事&#xff0c;监管企业和第三方检测公司规范开展检测业务&#xff0c;但是部分系统给第三方检测企业增加了大量的工作量&#xff0c;有的甚至由于系统不稳定&#xff0c;造成企业无法开展工作&#…

各种Attention|即插即用|适用于YoloV5、V7、V8、V9、V10(一)

摘要 本文总结了各种注意力&#xff0c;即插即用&#xff0c;方便大家将注意力加到自己的论文中。 SE import torch from torch import nn class SEAttention(nn.Module): """ SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;中的注意力…

排序——交换排序

在上篇文章我们详细介绍了排序的概念与插入排序&#xff0c;大家可以通过下面这个链接去看&#xff1a; 排序的概念及插入排序 这篇文章就介绍一下一种排序方式&#xff1a;交换排序。 一&#xff0c;交换排序 基本思想&#xff1a;两两比较&#xff0c;如果发生逆序则交换…

Linux 下 redis 集群部署

目录 1. redis下载 2. 环境准备 3. redis部署 3.1 修改系统配置文件 3.2 开放端口 3.3 安装 redis 3.4 验证 本文将以三台服务器为例&#xff0c;介绍在 linux 系统下redis的部署方式。 1. redis下载 下载地址&#xff1a;Index of /releases/ 选择需要的介质下载&am…

【笔记】在虚拟中的主从数据库连接实体数据库成功后的从数据库不同步问题解决方法1

130是主数据库 131是从数据 数据可以说是一点没同步 解决方法; 重新设置主从连接 在虚拟机中mysql账号xiaoming&#xff08;主从数据库的桥梁账号&#xff09;登录 主数据要做的&#xff1a; show master status&#xff1b; 可以发现 这两个值发送了变化 从数据库mysql中…

探索4D毫米波雷达和摄像头在自动驾驶中的潜力

随着自动驾驶技术的快速发展&#xff0c;关于各种传感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷达&#xff09;与毫米波雷达结合摄像头的作用&#xff0c;激发了激烈的讨论。在这篇博客中&#xff0c;我们将探讨4D毫米波雷达和摄像头的组合是否可能成为自动驾驶车辆…

一篇学通Axios

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js 环境。它提供了一种简单易用的方式来发送 HTTP 请求&#xff0c;并支持诸如请求和响应拦截、转换数据、取消请求以及自动转换 JSON 数据等功能。 Axios 名字的由来 Axios 的名字来源于希腊神话中的…

高校寻物平台小程序的设计

失主账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;寻物启示管理&#xff0c;失物归还管理&#xff0c;失物认领管理&#xff0c;举报投诉管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;寻物启示&#xff0c;失物招领&#xff0c;公告信息&…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…

【Python】爬虫实战01:获取豆瓣Top250电影信息

本文中我们将通过一个小练习的方式利用urllib和bs4来实操获取豆瓣 Top250 的电影信息&#xff0c;但在实际动手之前&#xff0c;我们需要先了解一些关于Http 请求和响应以及请求头作用的一些知识。 1. Http 请求与响应 HTTP&#xff08;超文本传输协议&#xff09;是互联网上…

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中&#xff0c;如何让虚拟人物的动作更加自然、真实&#xff0c;已经成为一个重要课题。AI4Animation项目&#xff0c;一个由 Sebastian Starke 主导的开源框架&#xff0c;为Unity开发者提供了强大的工具集&#xff0c;以实现这一目标。本文…

threadx netxduo stm32f407上实现http server

这次用的是CubeIDE + CubeMX 要把NX_APP的mem分配的大一些,在app_azure_rtos.c中,我给的是40*1024,如果给的不够,会导致后面无法分配pool和thread等等 需要用到filex 要在CubeMX里面勾选上,还要用到http_server和dhcp netxduo/addons/auto_ip at v6.1.11_rel eclipse-th…

AI时代:探索个人潜能的新视角

文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉 1.5.2 局限二&#xff1a;Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发…

怎么安装Manim库在Windows环境下的Jupyter Notebook上

Manim 是解释性数学视频的动画引擎。 您可以使用它来制作数学视频&#xff08;或其他字段&#xff09;。也许你们会在有有些平台上会看过特别好看的数学动画&#xff0c;例如 3Blue1Brown等。这些动画特别好看&#xff0c;还特别丝滑&#xff0c;基本找不到太大的毛病。 我当初…

初步探究Rust生态与图形界面编程

引言 Rust作为一种现代的、安全的系统编程语言&#xff0c;自2010年问世以来&#xff0c;逐渐在开发社区中崭露头角。它的内存安全保证、并发处理能力、以及无需垃圾回收机制的高性能特性&#xff0c;使得它成为了开发系统工具、网络服务、以及嵌入式系统的热门选择。然而&…

20240715 每日AI必读资讯

&#x1f310; 代号“ 草莓 ”&#xff0c;OpenAI 被曝研发新项目&#xff1a;将 AI 推理能力提至新高度 - OpenAI 公司被曝正在研发代号为“ 草莓 ”的全新项目&#xff0c;进一步延伸去年 11 月宣布的 Q* 项目&#xff0c;不断提高 AI 推理能力&#xff0c;让其更接近人类的…

32路串口服务器 应用领域

32路串口服务器在多个领域有着广泛的应用&#xff0c;以下是详细的应用实例&#xff1a; 一、工业自动化 在工业自动化领域&#xff0c;32路串口服务器发挥着举足轻重的作用。传统的工业设备往往采用串口通信方式&#xff0c;而串口服务器能够将这些设备接入网络&#xff0c;…