蓝桥杯-蓝桥幼儿园(Java-并查集)

news2025/5/18 7:54:02

并查集的核心思想

并查集主要由两个操作构成:

  • Find:查找某个元素所在集合的根节点。并查集的特点是,每个元素都指向它自己的父节点,根节点的父节点指向它自己。查找过程中可以通过路径压缩来加速后续的查找操作,即将路径上所有节点直接指向根节点。

  • Union:将两个集合合并。如果两个元素属于不同的集合,我们将它们的集合合并起来。为了提高效率,我们可以使用按秩合并(将树较矮的集合合并到树较高的集合下)。

问题描述

在这里插入图片描述

思路分析

在这个问题中,我们可以将每个人视为一个节点,朋友关系视为连通关系,判断两个人是否是朋友其实就是判断他们是否属于同一组。通过并查集,我们可以高效地实现这两种操作:合并操作(Union)和查找操作(Find)。

  1. 查找操作:对于一个给定的节点,我们需要找到它的根节点,也就是它所在集合的代表元素。通过路径压缩的技巧,我们能够在查找过程中将路径上的所有节点直接指向根节点,从而减少后续查询的时间复杂度。

  2. 合并操作:当两个节点属于不同的集合时,我们需要将它们合并为一个集合。为了保证合并操作的效率,我们使用了按秩合并的策略,即将树矮的集合合并到树高的集合下,这样可以尽可能减少树的高度,提高查询效率。

解决步骤

  1. 初始化:首先我们创建一个大小为 n+1 的数组 parent,用于存储每个节点的父节点。在初始化时,每个节点的父节点都指向自己,表示每个节点是独立的。

  2. 操作解析

    • 对于 op == 1 的操作,表示将两个节点 xy 连接成一个集合。我们通过调用 union(x, y) 来合并它们的集合。
    • 对于 op == 2 的操作,表示查询两个节点 xy 是否属于同一集合。我们通过调用 find(x)find(y) 来查询它们的根节点,如果根节点相同,则表示它们是朋友关系。
  3. 路径压缩与按秩合并

    • find 操作中,我们使用了路径压缩技术。每次查找时,我们都将路径上的所有节点直接指向根节点,这样可以有效减少查找时的时间复杂度。
    • union 操作中,我们使用按秩合并的策略,通过比较两个集合的大小,将较小的集合合并到较大的集合中,从而保证了合并操作的效率。

代码:

import java.util.Scanner;

// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
   private static int[] parent;

    public static void main(String[] args) {
       
      
        //思想:维护一个数组将每个元素的朋友记录在里面,一个查找函数,一个合并函数
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        parent = new int[n + 1];

        // 初始化,每个节点的父节点指向自己
        for (int i = 1; i <= n; i++) {
            parent[i] = i;
        }

        for (int i = 0; i < m; i++) {
            int op = sc.nextInt();
            int x = sc.nextInt();
            int y = sc.nextInt();
            if (op == 1) {
                union(x, y);
            } else {
                System.out.println(find(x) == find(y) ? "YES" : "NO");
            }
        }
    }


    // 路径压缩的查找
    public static int find(int i) {
        // 我们需要找到该元素的根节点,先假设当前元素为根节点,
        //这个函数用来查找根节点,而根节点的父节点等于他自己,parent[root]=root
        if (i != parent[i]) {
            parent[i] = find(parent[i]);
        }
        return parent[i];
    }

    // 合并优化
    public static void union(int x, int y) {
        //将两个元素的父节,若是不同则需统一,统一不需要,由我们自定义谁成为父节点,一直按照这个规矩下去
        int rootx = find(x);
        int rooty = find(y);
        //如果父节点不同就需要操作,相同就不需要
        if (rooty != rootx) {
            parent[rooty] = rootx;
        }
    }
}

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

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

相关文章

C++蓝桥杯填空题(攻克版)

片头 嗨~小伙伴们&#xff0c;咱们继续攻克填空题&#xff0c;先把5分拿到手~ 第1题 数位递增的数 这道题&#xff0c;需要我们计算在整数 1 至 n 中有多少个数位递增的数。 什么是数位递增的数呢&#xff1f;一个正整数如果任何一个数位不大于右边相邻的数位。比如&#xf…

JS 构造函数实现封装性

通过构造函数实现封装性&#xff0c;构造函数生成的对象独立存在互不影响 创建实例对象时&#xff0c;其中函数的创建会浪费内存

一站式云分账系统!智能虚拟户分账系统成电商合规“刚需”

电商智能分账解决&#xff1a;电商一站式破解多平台资金管理难题集中管理分账&#xff0c;分账后秒到&#xff0c;并为针对电商行业三大核心痛点提供高效应对策略&#xff1a; 1. 票据合规困境 智能对接上下游交易数据流&#xff0c;构建自动化票据协同机制&#xff0c;有效规…

数组 array

1、数组定义 是一种用于存储多个相同类型数据的存储模型。 2、数组格式 &#xff08;1&#xff09;数据类型[ ] 变量名&#xff08;比较常见这种格式&#xff09; 例如&#xff1a; int [ ] arr0&#xff0c;定义了一个int类型的数组&#xff0c;数组名是arr0&#xff1b; &am…

linux命令六

逻辑卷 作用: 整合分散空间 空间支持扩大 步骤一:建立卷组&#xff08;VG&#xff09; 格式&#xff1a;vgcreate 卷组名 设备路径……. 如果分区不是卷组,则会先调用pvcreat 组建物理卷,再将其组建成组卷 Successfully:成功 example&#xff1a;例子 在man帮助中可以使用examp…

深度学习总结(8)

模型工作流程 模型由许多层链接在一起组成&#xff0c;并将输入数据映射为预测值。随后&#xff0c;损失函数将这些预测值与目标值进行比较&#xff0c;得到一个损失值&#xff0c;用于衡量模型预测值与预期结果之间的匹配程度。优化器将利用这个损失值来更新模型权重。 下面是…

基于docker搭建redis集群环境

在redis目录下创建redis-cluster目录&#xff0c;创建docker-compose.yml文化和generate.sh文件 【配置generate.sh文件】 for port in $(seq 1 9); \ do \ mkdir -p redis${port}/ touch redis${port}/redis.conf cat << EOF > redis${port}/redis.conf port 6379 …

分治-归并系列一>翻转对

目录 题目&#xff1a;解析&#xff1a;策略一&#xff1a; 代码&#xff1a;策略二&#xff1a; 代码&#xff1a; 题目&#xff1a; 链接: link 这题和逆序对区别点就是&#xff0c;要找到前一个元素是后一个元素的2倍 先找到目标值再&#xff0c;继续堆排序 解析&#xff1…

FFMPEG大文件视频分割传输教程,微信不支持1G文件以上

如下是一个2.77g的文件分割教程 . 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑&#xff0c;是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FF…

MySQL5.7数据库部署和安装

1. 准备系统环境 Vmawre安装CentOS7 略… 2. 下载MySQL5.7安装包 下载地址&#xff1a; https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 3. 卸载系统自带的MariaDB sudo yum remove $(rpm -qa | grep mariadb)4. 解压安…

Java学习手册:JVM、JRE和JDK的关系

在Java生态系统中&#xff0c;JVM&#xff08;Java虚拟机&#xff09;、JRE&#xff08;Java运行时环境&#xff09;和JDK&#xff08;Java开发工具包&#xff09;是三个核心概念。它们共同构成了Java语言运行和开发的基础。理解它们之间的关系对于Java开发者来说至关重要。本文…

如何用 esProc 实现 Oracle 和 MySQL 的混合运算

逻辑数仓可以实现多源混算&#xff0c;但需要配置视图、预处理数据&#xff0c;结构太沉重。duckdb 是轻量级的方案&#xff0c;但没有内置 Oracle 的 connector&#xff0c;自己开发难度又太高。同为轻量级方案&#xff0c;esProc 支持 JDBC 公共接口&#xff0c;可以实现任何…

Linux 第二讲 --- 基础指令(二)

前言 这是基础指令的第二部分&#xff0c;但是该部分的讲解会大量使用到基础指令&#xff08;一&#xff09;的内容&#xff0c;为了大家的观感&#xff0c;如果对Linux的一些基本指令不了解的话&#xff0c;可以先看基础指令&#xff08;一&#xff09;&#xff0c;同样的本文…

P8627 [蓝桥杯 2015 省 A] 饮料换购

题目描述 思路 一是可以多枚举几个数&#xff0c;找找规律 二可以模拟 代码 #include<bits/stdc.h> #define int long long using namespace std;const int N 2e510;int a[N]; int b[N]; //前缀和 signed main() {int n;cin >> n; //表示初始的饮料盖int ans …

《Vue Router实战教程》12.不同的历史记录模式

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 不同的历史记录模式 在创建路由器实例时&#xff0c;history 配置允许我们在不同的历史模式中进行选择。 Hash 模式 hash 模式是用 createWebHashHistory() 创建的&#xff1a; import { createRouter,…

第十五届蓝桥杯大赛软件赛省赛Python 大学 B 组试做(下)【本期题单: 缴纳过路费, 纯职业小组】

本期题单&#xff1a;缴纳过路费&#xff0c;纯职业小队 文章目录 缴纳过路费题目思路分析代码 纯职业小组题目思路分析 感谢大伙观看&#xff0c;别忘了三连支持一下大家也可以关注一下我的其它专栏&#xff0c;同样精彩喔~下期见咯~ 缴纳过路费 题目 题目链接&#xff1a;缴…

[UEC++]UE5C++各类变量相关知识及其API(更新中)

基础变量 UE自己定义的目的&#xff1a;1.跨平台&#xff1b;2.兼容反射&#xff1b;3.方便宏替换 FString 基础赋值与初始化 遍历与内存 迭代器访问 清除系列操作 合并 插入与移除 RemoveFromStart是从开头看&#xff0c;没有则移除失败返回false&#xff1b; RemoveFromEnd是…

RK3588 android12 适配 ilitek i2c接口TP

一&#xff0c;Ilitek 触摸屏简介 Ilitek 提供多种型号的触控屏控制器&#xff0c;如 ILI6480、ILI9341 等&#xff0c;采用 I2C 接口。 这些控制器能够支持多点触控&#xff0c;并具有优秀的灵敏度和响应速度。 Ilitek 的触摸屏控制器监测屏幕上的触摸事件。 当触摸发生时&a…

利用安固软件实现电脑屏幕录像:四种实用方法分享

在日常工作中&#xff0c;有时我们需要录制电脑屏幕以进行教学演示、软件操作记录或重要会议的存档。安固软件终端安全管理系统提供了强大的屏幕录像功能&#xff0c;可以满足这些需求。 接下来&#xff0c;本文将介绍如何使用安固软件设置电脑实时画面录像&#xff0c;并分享…

[Effective C++]条款30:透彻了解inlining的里里外外

. 1、内联函数 inline内联函数的设计是为了消除函数调用的开销&#xff0c;在编译期间由编译器将函数体插入到每个调用点&#xff0c;来避免常规函数调用时的压栈、跳转和返回等操作&#xff0c;减少函数调用的时间开销。 1.1、内联函数作用 减少函数调用开销&#xff1a; 消…