acwing 并查集

news2024/10/7 8:29:40

目录

  • 并查集的路径压缩两种方法
    • 法一
    • 法二
  • AcWing 240. 食物链
  • AcWing 837. 连通块中点的数量
    • 示例并查集
    • 自写并查集

并查集的路径压缩两种方法

法一

  • 沿着路径查询过程中,将非根节点的值都更新为最后查到的根节点
int find(int x)
{
    if (p[x] != x) 
    	p[x] = find(p[x]);
    return p[x];
}

法二

int find_root(int x)
{
    int root = x;
    while(ufs[root] >= 0)
        root = ufs[root];
    while(ufs[x] >= 0)
    {
        int parent = ufs[x];
        ufs[x] = root;
        x = parent;
    }
    return root;
}

AcWing 240. 食物链

https://www.acwing.com/problem/content/description/242/

  • 此题增加了每一个节点的权重,即其到根节点的距离
  • 以此距离来判断该节点的动物种类
    在这里插入图片描述
#include <iostream>

using namespace std;
const int N = 5e4 + 10;

int n, k, ufs[N], d[N];

int find_root(int x)
{
    if(x != ufs[x])
    {
        int tmp = find_root(ufs[x]);
        // 这里考虑发生集合合并的情况
        // 因为这里用了路径压缩,
        // 所以只有合并集合时会有这种情况
        // 所以+=的是被合并的原根节点到新根节点的距离
        d[x] += d[ufs[x]];
        ufs[x] = tmp;
    }
    return ufs[x];
}

int main()
{
    cin >> n >> k;
    for(int i = 0; i < n; ++i)
        ufs[i] = i;
    int ret = 0;
    while(k--)
    {
        int t, a, b;
        // cin >> t >> a >> b;
        scanf("%d%d%d", &t, &a, &b);
        if(a > n || b > n)
        {
            ret++;
            continue;
        }
        int ra = find_root(a), rb = find_root(b);
        if(t == 1)
        {
            if(ra == rb && (d[a] - d[b]) % 3)
                ret++;
            else if(ra != rb)
            {
                ufs[ra] = rb;
                d[ra] = d[b] - d[a];
            }
        }
        else
        {
            // 根相同,判断距离
            if(ra == rb && (d[a] - d[b] - 1) % 3)
                ret++;
            // 根不同,合并两集合
            else if(ra != rb)
            {
                ufs[ra] = rb;
                d[ra] = d[b] - d[a] + 1;
            }
        }
    }
    printf("%d", ret);
    return 0;
}


AcWing 837. 连通块中点的数量

示例并查集

#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int p[N], cnt[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;
        cnt[i] = 1;
    }
    while (m -- )
    {
        string op;
        int a, b;
        cin >> op;
        if (op == "C")
        {
            cin >> a >> b;
            a = find(a), b = find(b);
            if (a != b)
            {
                p[a] = b;
                cnt[b] += cnt[a];
            }
        }
        else if (op == "Q1")
        {
            cin >> a >> b;
            if (find(a) == find(b)) puts("Yes");
            else puts("No");
        }
        else
        {
            cin >> a;
            cout << cnt[find(a)] << endl;
        }
    }
    return 0;
}

自写并查集

#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int n, m;
vector<int> ufs(N, -1);
int find_root(int x)
{
    int root = x;
    while(ufs[root] >= 0)
        root = ufs[root];
    // 路径压缩,不然会超时
    while(ufs[x] >= 0)
    {
        int parent = ufs[x];
        ufs[x] = root;
        x = parent;
    }
    return root;
}
void union_set(int a, int b)
{
    int ra = find_root(a), rb = find_root(b);
    if(abs(ufs[ra] > abs(ufs[rb])))
        swap(ra, rb);
    if(ra != rb)
    {
        ufs[rb] += ufs[ra];
        ufs[ra] = rb;
    }
}

void find_union(int a, int b)
{
    int ra = find_root(a), rb = find_root(b);
    if(ra == rb)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}

void count_set(int x)
{
    int r = find_root(x);
    cout << abs(ufs[r]) << endl;
}
int main()
{
    cin >> n >> m;
    string op;
    int a, b;
    while(m--)
    {
        cin >> op >> a;
        if(op == "C")
        {
            cin >> b;
            union_set(a, b);
        }
        else if(op == "Q1")
        {
            cin >> b;
            find_union(a, b);
        }
        else
            count_set(a);
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LitJson-Json字符串转对像时:整型与字符串或字符串转:整型进的类型不一致的处理

目录 问题描述上代码测试代码各位看官&#xff0c;打赏个1元吧 Json数据格式是大家在游戏开中常量用的一种数据格式&#xff0c;某种程度上可以说是必备的。对unity开发来说&#xff0c;LitJson这个json库应该是被使用最多的json库了。 问题描述 今天说要的其中的这个api: Jso…

【docker】centos7安装harbor

目录 零、前提一、下载离线包二、安装三、访问四、开机自启 零、前提 1.前提是已经安装了docker和docker-compose 一、下载离线包 1. csdn资源&#xff1a;harbor-offline-installer-v2.10.0.tgz 2. 百度云盘&#xff08;提取码&#xff1a;ap3t&#xff09;&#xff1a;harbo…

YOLOv8 Ultralytics:使用Ultralytics框架进行姿势估计

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行姿势估计 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行姿势估计参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可…

*5.1 Global Memory Bandwidth

并行程序的执行速度可能因计算硬件的资源限制而有很大差异。虽然管理并行代码和硬件资源约束之间的交互对于在几乎所有并行编程模型中实现高性能很重要&#xff0c;但这是一种实用技能&#xff0c;最好通过为高性能设计的并行编程模型中的实践练习来学习。在本章中&#xff0c;…

探索大模型时代下的文档识别与分析【GPT4-V带来的挑战与机遇】

中国图象图形学学会青年科学家会议是由中国图象图形学学会青年工作委员会发起的学术会议。本会议面向国际学术前沿与国家战略需求&#xff0c;致力于支持图象图形领域的优秀青年学者&#xff0c;为青年学者们提供学术交流与研讨的平台&#xff0c;促进学者之间的交流与合作。会…

FreeRTOS学习总结(二)FreeRTOS任务创建和删除API函数

实现动态创建任务流程 任务控制块结构体成员介绍 typedef struct tskTaskControlBlock {volatile StackType_t * pxTopOfStack; /* 任务栈栈顶&#xff0c;必须为TCB第一个成员 */ListItem_t xStateListItem; /* 任务状态列表项 */ Li…

Mobile Aloha 【软硬件原理+代码解析】

1. Mobile ALOHA Hardware2. Imitation Learning3. Co-training with Static ALOHA Data4. Task Setting5. Experiments5.1 ACT5.2 对比ACT、Diffusion Policy和VINN 6. Software Code Analyze Mobile ALOHA: 利用低成本全身远程操作系统学习复杂的双手移动操作技能 [译] 硬件代…

SAP BAPI_OUTB_DELIVERY_CONFIRM_DEC 交货单过账提示 VL602 为交货的发货已经计帐

原因 如果尝试从交货处理的初始屏幕过账交货的货物移动&#xff0c;并且已为交货执行此步骤&#xff0c;则系统会正确发出消息 VL602&#xff08;“已针对交货过账发货”&#xff09;和/或 VL636&#xff08;“已过账此入库交货的收货”&#xff09;。 之后&#xff0c;无法再…

前端入门教程:学完即可单独完成前端项目

目录 目录 1.HTML: 1.1概念 1.2结构 1.3常见的标签使用分类&#xff1a; 2.CSS: 2.1概念 2.2样式实践&#xff1a; 以下的举例都来自于博客&#xff1a; 2.3css选择器&#xff1a; 什么是css选择器&#xff1a; 举例如下&#xff1a; 2.4Demo 3.JavaScript&#…

什么台灯最好学生晚上用?学生晚上用的护眼台灯推荐

随着人们对健康生活的追求日益增加&#xff0c;越来越多的人开始关注眼睛健康问题。而台灯作为人们日常生活和工作中常用的照明设备之一&#xff0c;护眼台灯的出现成为了人们关注的焦点。那么&#xff0c;作为课业负担比较重的学生群体&#xff0c;有什么护眼台灯是适合他们晚…

echarts - xAxis.type设置time时该如何使用formatter的分级模板

echarts 文档中描述了x轴的多种类型 一、type: ‘value’ ‘value’ 数值轴&#xff0c;适用于连续数据。 此时x轴数据是从零开始&#xff0c;有数据大小的区分。 【注意】 因为xAxis.data是为category服务的&#xff0c;所以xAxis.data里面设置的数据无效。 二、type: ‘ca…

2023回顾

今年遇到最大的问题&#xff1a; 屏幕无故卡死&#xff0c;原因各种各样&#xff0c;至今虽说已排查了大部分的原因&#xff0c;也规避掉了一些可能问题&#xff0c;但随着新功能的添加&#xff0c;还是有可能不小心引入。 期间的解决方案也发布在Qt 屏幕偶发性失灵_qt 虚拟键盘…

Springboot+RocketMQ通过事务消息优雅的实现订单支付功能

目录 1. 事务消息 1.1 RocketMQ事务消息的原理 1.2 RocketMQ订单支付功能设计 1. 事务消息 RocketMQ的事务消息&#xff0c;是指发送消息事件和其他事件需要同时成功或同时失败。比如银行转账&#xff0c; A银行的某账户要转一万元到B银行的某账户。A银行发送“B银行账户增加…

如何让GPT支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…

记一次JSF异步调用引起的接口可用率降低

前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程&#xff0c;主要介绍了排查思路和JSF异步调用的流程&#xff0c;希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF 1,7.5-HOTFIX-T6版本。 起因 问题背景…

强化学习的数学原理学习笔记 - Actor-Critic

文章目录 概览&#xff1a;RL方法分类Actor-CriticBasic actor-critic / QAC&#x1f7e6;A2C (Advantage actor-critic)Off-policy AC&#x1f7e1;重要性采样&#xff08;Importance Sampling&#xff09;Off-policy PGOff-policy AC &#x1f7e6;DPG (Deterministic AC) 本…

使用fs.renameSync(oldPath,newPath)方法,报错Error: ENOENT: no such file or directory

报错翻译&#xff1a;由于文件或目录不存在导致的。 解决方法&#xff1a;查看给定的路径&#xff0c;确保路径和文件名正确&#xff0c;并且文件或目录确实存在。

C语言--结构体详解

C语言--结构体详解 1.结构体产生原因2.结构体声明2.1 结构体的声明2.2 结构体的初始化2.3结构体自引用 3.结构体内存对齐3.1 对齐规则3.2 为什么存在内存对齐3.3 修改默认对⻬数 4. 结构体传参 1.结构体产生原因 C语言将数据类型分为了两种&#xff0c;一种是内置类型&#xf…

Spring学习 Spring事务控制

7.1.事务介绍 7.1.1.什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不…

2.SPSS数据文件的建立和管理

文章目录 数据文件的特点建立SPSS数据文件步骤 数据文件的结构变量的规则 数据的录入和保存录入数据保存文件 数据的编辑数据定位 数据文件的特点 SPSS数据库文件包括文件结构和数据两部分 SPSS数据文件中的一列数据称为一个变量。每个变量都应有一个名称&#xff0c;即&…