华为OD机试 - 发广播 - 并查集(Java 2023 B卷 200分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、并查集
      • Java 实现并查集
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某地有N个广播站,站点之间有些有连接,有些没有。

有连接的站点在接受到广播后会互相发送。

给定一个N*N的二维数组matrix,数组的元素都是字符"0"或者"1"。

Matrix[i][j]="1"代表i和j站点之间有连接,matrix[i][j]="0"代表没连接。

现在要发一条广播,问初始最少给几个广播站发送,才能保证所有的广播站都收到消息。

二、输入描述

从stdin输入,共一行数据,表示二维数组的各行,用逗号分隔行。保证每行字符串所合的字符数一样的。

三、输出描述

返回初始最少需要发送广播站个数。

例如:

1、输入

110,110,001

2、输出

2

3、说明

站点1和站点2有直接连接,站点3和站点1和站点2没有直接连接,所以开始至少需要两个站点的广播。

四、并查集

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。并查集的主要操作包括合并两个集合以及查询元素所属集合。

并查集的具体实现通常是通过一个父节点数组来实现的,数组中的每个元素都指向它的父节点。在初始化时,每个元素都是自己的父节点,表示它们各自构成一个单独的集合。当需要合并两个集合时,将一个集合的根节点的父节点指向另一个集合的根节点,从而将它们连接起来。在查询元素所属集合时,只需要通过不断查找父节点的方式,找到元素的根节点,即所在集合的代表元素。

并查集的主要应用包括解决连通性问题、最小生成树等问题。在信息学的国际国内赛题中,也常常出现需要使用并查集来解决的问题。这类问题的特点是数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间内计算出试题需要的结果,只能用并查集来描述。

Java 实现并查集

public class UnionFind {  
    private int[] parent; // 用于存储每个元素的父节点  
    private int[] rank; // 用于存储每个元素所在集合的大小(秩)  
  
    // 构造方法,初始化并查集  
    public UnionFind(int n) {  
        parent = new int[n];  
        rank = new int[n];  
        for (int i = 0; i < n; i++) {  
            parent[i] = i; // 每个元素初始时都是自己的父节点  
            rank[i] = 1; // 每个元素初始时都构成一个单独的集合,集合大小为1  
        }  
    }  
  
    // 查找元素x所在的集合,即找到它的根节点  
    public int find(int x) {  
        if (x != parent[x]) {  
            parent[x] = find(parent[x]); // 路径压缩,将x的父节点直接设为根节点  
        }  
        return parent[x];  
    }  
  
    // 合并元素x和元素y所在的集合  
    public void union(int x, int y) {  
        int rootX = find(x); // 找到元素x的根节点  
        int rootY = find(y); // 找到元素y的根节点  
        if (rootX == rootY) {  
            return; // 如果它们已经在同一个集合中,则无需合并  
        }  
        // 根据两个集合的大小,将小的集合合并到大的集合中,以达到树高最小的效果  
        if (rank[rootX] > rank[rootY]) {  
            parent[rootY] = rootX;  
        } else if (rank[rootX] < rank[rootY]) {  
            parent[rootX] = rootY;  
        } else {  
            parent[rootY] = rootX;  
            rank[rootX]++; // 若两个集合大小相等,则合并后新的集合大小加1  
        }  
    }  
}

以上代码中,使用了一个整型数组parent来存储每个元素的父节点,以及一个整型数组rank来存储每个元素所在集合的大小(秩)。在构造方法中,初始化了这两个数组。在查找操作中,使用了路径压缩技术,将元素的父节点直接设为根节点,以加快查找速度。在合并操作中,根据两个集合的大小,将小的集合合并到大的集合中,以达到树高最小的效果。

五、Java算法源码

public class OdTest02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] matrix = sc.nextLine().split(",");
        int n = matrix.length;

        UnionFind uf = new UnionFind(n);
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (matrix[i].charAt(j) == '1') {
                    uf.union(i, j);
                }
            }
        }
        System.out.println(uf.count);
    }
}

// 并查集
class UnionFind {
    int[] pre;
    int count;

    /**
     * 初始化
     */
    public UnionFind(int n) {
        pre = new int[n];
        for (int i = 0; i < n; i++) {
            pre[i] = i;
        }
        count = n;
    }

    /**
     * 查找元素 x 的树的根
     */
    public int find(int x) {
        if (x != pre[x]) {
            pre[x] = find(pre[x]);
            return pre[x];
        }
        return x;
    }

    /**
     * 合并
     */
    public void union(int x, int y) {
        int x_pre = find(x);
        int y_pre = find(y);

        if (x_pre != y_pre) {
            pre[y_pre] = x_pre;
            count--;
        }
    }
}

六、效果展示

1、输入

110,110,001

2、输出

2

3、说明

站点1和站点2有直接连接,站点3和站点1和站点2没有直接连接,所以开始至少需要两个站点的广播。

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

机器学习算法(12) — 集成技术(Boosting — Xgboost 分类)

一、说明 时间这是集成技术下的第 4 篇文章&#xff0c;如果您想了解有关集成技术的更多信息&#xff0c;您可以参考我的第 1 篇集成技术文章。 机器学习算法&#xff08;9&#xff09; - 集成技术&#xff08;装袋 - 随机森林分类器和...... 在这篇文章中&#xff0c;我将解释…

​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化

2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开&#xff0c;吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果&#xff0c;引发与会者热烈关注。 re:Invent的核心主题是…

057:vue组件方法中加载匿名函数

第057个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

激光打标机:快速、精确、耐用的标记解决方案

随着科技的不断进步&#xff0c;激光打标机已经成为现代工业生产中不可或缺的一部分。作为一种高效、精确、耐用的标记解决方案&#xff0c;激光打标机在各个领域都发挥着重要的作用。 一、快速、精确的标记技术 激光打标机采用激光束作为标记工具&#xff0c;通过精确控制激光…

华为鸿蒙操作系统简介及系统架构分析(2)

接前一篇文章&#xff1a;华为鸿蒙操作系统简介及系统架构分析&#xff08;1&#xff09; 本文部分内容参考&#xff1a; 鸿蒙系统学习笔记(一) 鸿蒙系统介绍 特此致谢&#xff01; 上一回对于华为的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;进行了介绍并说明了其层次化…

医保购药小程序:智能合约引领医疗数字革新

在医疗领域&#xff0c;医保购药小程序通过引入智能合约技术&#xff0c;为用户提供更为高效、安全的购药体验。本文将通过简单的智能合约代码示例&#xff0c;深入探讨医保购药小程序如何利用区块链技术中的智能合约&#xff0c;实现医保结算、购药监控等功能&#xff0c;为医…

Linux 宿主机搭建jenkins

目录 前言错误信息 前言 最近项目需要使用jenkins进行CICD&#xff0c;搭建后始终找不到git 错误信息 Source Code Management None出现这种情况主要是插件没有了&#xff0c;需要我们安装插件&#xff1a;

深入理解网络 I/O:mmap、sendfile、Direct I/O

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

scrapy_redis概念作用和流程

scrapy_redis概念作用和流程 学习目标 了解 分布式的概念及特点了解 scarpy_redis的概念了解 scrapy_redis的作用了解 scrapy_redis的工作流程 在前面scrapy框架中我们已经能够使用框架实现爬虫爬取网站数据,如果当前网站的数据比较庞大, 我们就需要使用分布式来更快的爬取数…

PDF文件如何设置限制打印?

想要限制PDF文件的打印功能&#xff0c;想要限制PDF文件打印清晰度&#xff0c;都可以通过设置限制编辑来达到目的。 打开PDF编辑器&#xff0c;找到设置限制编辑的界面&#xff0c;切换到加密状态&#xff0c;然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…

FPGA——XILINX原语(1)

FPGA——XILINX原语&#xff08;1&#xff09; 1.时钟组件&#xff08;1&#xff09;BUFG&#xff08;2&#xff09;BUFH&#xff08;3&#xff09;BUFR&#xff08;4&#xff09;BUFIO&#xff08;5&#xff09;使用场景 2.IO端口组件&#xff08;1&#xff09;IDDR&#xff0…

3. 行为模式 - 迭代器模式

亦称&#xff1a; Iterator 意图 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对象的…

flink watermark 实例分析

WATERMARK 定义了表的事件时间属性&#xff0c;其形式为: WATERMARK FOR rowtime_column_name AS watermark_strategy_expression rowtime_column_name 把一个现有的列定义为一个为表标记事件时间的属性。该列的类型必须为 TIMESTAMP(3)/TIMESTAMP_LTZ(3)&#xff0c;且是 sche…

【让云服务器更灵活】iptables转发tcp/udp端口请求

iptables转发tcp/udp端口请求 文章目录 前言一、路由转发涉及点二、转发如何配置本机端口转发到本机其它端口本机端口转发到其它机器 三、固化iptables总结 前言 路由转发是计算机网络中的一种重要概念&#xff0c;特别是在网络设备和系统之间。它涉及到如何处理和传递数据包&…

【湖仓一体尝试】MYSQL和HIVE数据联合查询

爬了两天大大小小的一堆坑&#xff0c;今天把一个简单的单机环境的流程走通了&#xff0c;记录一笔。 先来个完工环境照&#xff1a; mysqlhadoophiveflinkicebergtrino 得益于IBM OPENJ9的优化&#xff0c;完全启动后的内存占用&#xff1a; 1&#xff09;执行联合查询后的…

《A++ 敏捷开发》-1 如何改善

1 如何改善 敏捷开发过程改进案例 5月 A公司一直专门为某电信公司提供针对客服、线上播放等服务。 张工是公司的中层管理者&#xff0c;管理好几个开发团队&#xff0c;有5位项目经理向他汇报。 他听说老同学的团队都开始用敏捷开发&#xff0c;很感兴趣&#xff0c;便参加了…

YACS(上海计算机学会竞赛平台)三星级挑战——两数之和

题目描述 给定 n 个整数 a[1]​,a[2]​,⋯,a[n]​&#xff0c;并且保证 a[1​]≤a[2​]≤⋯≤a[n]​ 再给定一个目标值 t&#xff0c;请判断能否找到 a[i]​ 与 a[j]​&#xff0c;ai​aj​t 且 i≠j。 输入格式 第一行&#xff1a;单个整数n&#xff1b; 第二行&#xf…

油猴脚本教程案例【键盘监听】-编写 ChatGPT 快捷键优化

文章目录 1. 元数据1. name2. namespace3. version4. description5. author6. match7. grant8. icon 2. 编写函数.1 函数功能2.1.1. input - 聚焦发言框2.1.2. stop - 取消回答2.1.3. newFunction - 开启新窗口2.1.4. scroll - 回到底部 3. 监听键盘事件3.1 监听X - 开启新对话…

3D模型人物换装系统(二 优化材质球合批降低DrawCall)

3D模型人物换装系统 介绍原理合批材质对比没有合批材质核心代码完整代码修改总结 介绍 本文使用2018.4.4和2020.3.26进行的测试 本文没有考虑法线贴图合并的问题&#xff0c;因为生成法线贴图有点问题&#xff0c;放在下一篇文章解决在进行优化 如果这里不太明白换装的流程可以…

Python---socket之send和recv原理剖析

1. 认识TCP socket的发送和接收缓冲区 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区&#xff0c;这个发送和接收缓冲区指的就是内存中的一片空间。 2. send原理剖析 send是不是直接把数据发给服务端? 不是&#xff0c;要想发数据&#xff0c;必须得…