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

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

并查集的核心思想

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

  • 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.dtcms.com/a/122680.html

相关文章:

  • 【KWDB 创作者计划】_KWDB:开源引领数据库创新变革
  • 多图超详细:Docker安装知识库AI客服RAGFlow的详细步骤、使用教程及注意事项:
  • Vue接口平台学习五——测试环境页面
  • 关于量化交易在拉盘砸盘方面应用的部分思考
  • HTML 是什么?网页创建的核心标记语言
  • 如何开发英语在线训练小程序:从0到1的详细步骤
  • spring-cloud-starter-alibaba-seata使用说明
  • C++ RAII 的用途及业务代码实现案例
  • 20周年系列|美创科技再度入围「年度高成长企业」系列榜单
  • 鸿蒙NEXT开发Preferences工具类(ArkTs)
  • Python生成器与列表的对照使用详解
  • 2025高教社杯全国大学生数学建模竞赛——5个月备赛规划
  • Spring Boot 启动后自动执行 Service 方法终极指南
  • 正则表达式补充——python
  • leetcode_707. 设计链表_java
  • Leetcode 34.在排序数组中查找元素的第一个和最后一个位置
  • 游戏引擎学习第211天
  • 毫米波测试套装速递!高效赋能5G/6G、新材料及智能超表面(RIS)研发
  • Stable Diffusion + CelebA-Dialog 数据集:不同数据集文本标签格式不一致?我的实验记录
  • python学智能算法(十)|机器学习逻辑回归(Logistic回归)
  • Django学习记录-2-数据库
  • mysql的下载和安装2025.4.8
  • 计算机网络——传输层(Udp)
  • Java 原型模式 详解
  • 如何在Linux系统上通过命令调用本地AI大模型?
  • qt之opengl使用
  • 【精品PPT】2025固态电池知识体系及最佳实践PPT合集(36份).zip
  • 移动端六大语言速记:第11部分 - 内存管理
  • ChatGPT 4:引领 AI 创作新时代
  • [ctfshow web入门] web29