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

news2024/11/24 15:12:15

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 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在线答疑。

在这里插入图片描述

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

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

相关文章

机器学习算法(11)——集成技术(Boosting——梯度提升)

一、说明 在在这篇文章中&#xff0c;我们学习了另一种称为梯度增强的集成技术。这是我在机器学习算法集成技术文章系列中与bagging一起介绍的一种增强技术。我还讨论了随机森林和 AdaBoost 算法。但在这里我们讨论的是梯度提升&#xff0c;在我们深入研究梯度提升之前&#xf…

【算法设计与分析】——动态规划算法

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

OpenAI公布ChatGPT安全框架

12月19日&#xff0c;OpenAI在官网公布了“准备框架”&#xff08;Preparedness Framework&#xff09;测试版。该文档详细介绍了OpenAI是如何保证ChatGPT等产品的安全防护措施、开发和部署流程。 OpenAI表示&#xff0c;随着大模型的功能迭代不断完善&#xff0c;其能力已经开…

Diss一下ApiPost国产软件

如图所示&#xff0c;我用ApiPost和PostMan调用同一个接口同样的参数。 后端返回的数字是20231204183521830&#xff0c;在ApiPost中却变成了20231204183521832。不能理解为什么数字会2 。 而PostMan这边返回的值是正确的。 看来ApiPost确实是遥遥领先了

30. MVC设计模式

JavaEE 开发流程 ↓MVC的概念 MVC是Model-View-Controller的简称&#xff0c;即模型-视图-控制器。 MVC是一种设计模式&#xff0c;它把应用程序分成三个核心模块&#xff1a;模型、视图、控制器&#xff0c;它们各自处理自己的任务。 模型(model) 模型是应用程序的主体部分…

本地使用 docker 运行OpenSearch + Dashboard + IK 分词插件

准备基础镜像 注意一定要拉取和当前 IK 分词插件版本一致的 OpenSearch 镜像: https://github.com/aparo/opensearch-analysis-ik/releases 写这篇文章的时候 IK 最新版本 2.11.0, 而 dockerhub 上 OpenSearch 最新版是 2.11.1 如果版本不匹配的话是不能用的, 小版本号对不上…

Python---TCP 客户端程序开发

1. 开发 TCP 客户端程序开发步骤回顾 创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字 2. socket 类的介绍 导入 socket 模块 import socket 创建客户端 socket 对象 socket.socket(AddressFamily, Type) 参数说明: AddressFamily 表示IP地…

SpringBoot 3.2.0实战

SpringBoot 3.2.0实战 1. 关键知识点2. 后端开发(SpringBoot 3.2.0)2.1 接口实现的三大步2.2 参数校验2.3 登录认证2.4 获取用户信息2.5 更新用户基本信息2.6 更新用户头像2.7 更新用户密码 3. 前端开发&#xff08;Vue3Element-Plus)3.1 前置知识3.2 常用指令3.2.1 v-for3.2.2…

Java 并发编程 —— 透过源码剖析 ForkJoinPool

目录 一. 前言 二. 工作窃取的实现原理 2.1. WorkQueue&#xff08;工作队列&#xff09; 2.2. 工作窃取流程 三. ForkJoinPool 源码解析 3.1. ForkJoinPool 的字段 3.1.1. 常量 3.1.2. 成员变量 3.1.3. ctl&#xff08;5个部分组成&#xff09; 3.2. 构造函数 3.3.…

Fabric:使用GoLand+Fabric-SDK-Go操作Fabric网络

遇到bug, 未完待续!!! 写在最前 前序博客已经介绍了使用命令的方式在Fabric上创建通道以及部署执行链码的方法&#xff0c;但这个过程太繁琐&#xff0c;尤其是当Fabric网络中peer节点和组织Org过多时&#xff0c;需要频繁的更改环境变量。 Hyperledger Fabric官方提供了Fabri…

[论文分享]TimeDRL:多元时间序列的解纠缠表示学习

论文题目&#xff1a;TimeDRL: Disentangled Representation Learning for Multivariate Time-Series 论文地址&#xff1a;https://arxiv.org/abs/2312.04142 代码地址&#xff1a;暂无 关键要点&#xff1a;多元时间序列&#xff0c;自监督表征学习&#xff0c;分类和预测 摘…

<JavaEE> 网络编程 -- 网络编程和 Socket 套接字

目录 一、网络编程的概念 1&#xff09;什么是网络编程&#xff1f; 2&#xff09;网络编程中的基本概念 1> 收发端 2> 请求和响应 3> 客户端和服务端 二、Socket套接字 1&#xff09;什么是“套接字”&#xff1f; 2&#xff09;Socket套接字的概念 3&…

ToB还是ToC?工业级与消费级AR眼镜都能干什么?

来源&#xff1a;虹科数字化与AR 虹科分享 | ToB还是ToC&#xff1f;工业级与消费级AR眼镜都能干什么&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/lyTASoKm29woIbfcKBtMvQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 随着科技的飞速发展&#…

VLOOKUP中的#N/A错误很常见,这里有详细排除步骤

你的VLOOKUP是否提取了错误的数据&#xff0c;或者你根本无法使其工作&#xff1f;本教程展示了如何快速修复常见的VLOOKUP中的#N/A错误并克服其主要限制。 ​在VLOOKUP公式中&#xff0c;当Excel找不到查找值时&#xff0c;会显示#N/A错误消息&#xff08;意思是“不可用”&a…

Navicat里MySQL表的创建(详细)

我以Navicat连接MySQL为例&#xff0c;演示表的创建方法。 前提 创建表的语法&#xff1a; create table 表名 &#xff08; 字段名1&#xff0c;字段类型&#xff0c; 字段名2&#xff0c;字段类型&#xff0c; ...... 字段名n&#xff0c;字段类型 ); 我计划在test库存放一…

HarmonyOS引导页登陆页以及tabbar的代码说明 home 下拉刷新页代码 5

下拉刷新页 代码说明 这一页第一次运行时很卡&#xff0c;就是你点击修改&#xff0c;要等一会才出来&#xff0c;加一句&#xff0c;修改的字样原来应是修车二字。只能将错就错。 const TopHeight 200; Component export default struct Car {State list: Array<number&…

【数据结构】五、数组与广义表

目录 一、定义 二、计算数组元素地址 三、稀疏矩阵快速转置 稀疏矩阵的表示 稀疏矩阵快速转置 四、广义表 一、定义 我们所熟知的一维、二维数组的元素是原子类型。广义表中的元素除了原子类型还可以是另一个线性表。当然所有的数据元素仍然属于同一类型。 这里的数组可…

Docker容器的日常维护和故障排除

Docker容器已经成为了现代应用程序开发和部署的核心工具之一。然而&#xff0c;为了确保容器环境的稳定性和可靠性&#xff0c;日常维护和故障排除是必不可少的任务。本文将介绍一些关键的Docker容器维护和故障排除技巧&#xff0c;并提供丰富的示例代码&#xff0c;以帮助大家…

Flink 状态管理与容错机制(CheckPoint SavePoint)的关系

一、什么是状态 无状态计算的例子&#xff1a; 例如一个加法算子&#xff0c;第一次输入235那么以后我多次数据23的时候得到的结果都是5。得出的结论就是&#xff0c;相同的输入都会得到相同的结果&#xff0c;与次数无关。 有状态计算的例子&#xff1a; 访问量的统计&#x…

python超实用插件REST Client、autoDocstring、Better Comments

1. autoDocstring 1.1 features 快速生成可以通过制表符浏览的文档字符串片段。在几种不同类型的文档字符串格式之间进行选择。通过pep484类型提示、默认值和变量名称推断参数类型。支持args、kwargs、装饰器、错误和参数类型。 1.2 用法 光标必须位于定义正下方的行上&am…