华为OD机试 - 最长广播效应 - 广度优先搜索BFS(Java 2024 C卷 100分)

news/2024/7/20 19:25:12 标签: 华为od, 宽度优先, java

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

  • 某通信网络中有N个网络结点,用1到N进行标识。
  • 网络中的结点互联互通,且结点之间的消息传递有时延,相连结点的时延均为一个时间单位。
  • 现给定网络结点的连接关系link[i]={u,v},其中u和v表示网络结点。
  • 当指定一个结点向其他结点进行广播,所有被广播结点收到消息后都会在原路径上回复一条响应消息,请计算发送结点至少需要等待几个时间单位才能收到所有被广播结点的响应消息。

注:

N的取值范围为[1,100];
连接关系link的长度不超过3000,且1 <= u,v <= N;
网络中任意结点间均是可达的;

二、输入描述

  1. 输入的第一行为两个正整数,分别表示网络结点的个数N,以及时延列表的长度T;
  2. 接下来的T行输入,表示结点间的连接关系列表;
  3. 最后一行的输入为一个正整数,表示指定的广播结点序号;

三、输出描述

输出一个整数,表示发送结点接收到所有响应消息至少需要等待的时长。

1、输入

5 7
1 4
2 1
2 3
2 4
3 4
3 5
4 5
2

2、输出

2

3、说明

结点2到5的最小时延为2,到剩余结点的最小时延均为1,所以至少要等待2*2=4s。

四、解题思路

核心思想

  1. 找到距离起点最远的点
  2. 找到到达最远的点的最短路径

这是一道典型的BFS算法题。

BFS(广度优先搜索)是一种图遍历算法,它从一个起始点开始,逐层扩展搜索范围,直到找到目标节点为止。

这种算法通常用于解决“最短路径”问题,比如在迷宫中找到从起点到终点的最短路径

  1. 首先,你会从起点开始,检查所有与它相邻的位置,也就是距离起点为1的位置;
  2. 然后,你会继续向外扩展,检查所有距离起点为2的位置,以此类推,直到找到出口。

在BFS中,你可以使用队列来存储待搜索的节点。起始点首先加入队列中,然后不断从队列中取出节点,检查它是否是目标节点。如果不是,就将它的所有未被访问过的邻居加入队列中。这样,队列中的节点总是按照它们距离起点的距离排序,先加入队列的节点总是先被取出来搜索。

通过这种方式,BFS可以找到起点到目标节点的最短路径。在实际应用中,BFS还可以用于拓扑排序、连通性检测等问题的解决。

五、Java算法源码

java">public class Test05 {
    // 找到起始点到其它节点的最短路径的最大值乘2即可
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        /**
         * 1. 找到距离起点最远的点
         * 2. 找到到达最远的点的最短路径
         */
        int[] input1 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 网络结点的个数N
        int N = input1[0];
        // 时延列表的长度T
        int T = input1[1];
        Map<Integer, Set<Integer>> setMap = new HashMap<>();
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < T; i++) {
            int[] temp = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            set.add(temp[0]);
            set.add(temp[1]);
            Set<Integer> tempSet = setMap.getOrDefault(temp[0], new HashSet<Integer>());
            tempSet.add(temp[1]);
            setMap.put(temp[0], tempSet);
        }

        Integer[] arr = new Integer[N];
        set.toArray(arr);
        Arrays.sort(arr);

        int target = Integer.valueOf(sc.nextLine());
        // 找到距离起点最远的点
        int max = target - arr[0] > arr[N - 1] - target ? arr[0] : arr[N - 1];
        dfs(setMap, target, max, 0);
    }

    private static void dfs(Map<Integer, Set<Integer>> setMap, int target, int max, int step) {
        if (target == max) {
            System.out.println(step * 2);
            return;
        }
        Set<Integer> targetSet = setMap.get(target);
        Integer[] arr1 = new Integer[targetSet.size()];
        targetSet.toArray(arr1);
        Arrays.sort(arr1);
        // target能直达的最大点
        int targetToMax = arr1[targetSet.size() - 1];
        step++;
        dfs(setMap, targetToMax, max, step);
    }
}

六、效果展示

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

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

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

在这里插入图片描述


http://www.niftyadmin.cn/n/5452871.html

相关文章

数据分析之Power Pivot多表数据建模

Power Pivot 介绍&#xff1a; 可以融合多个数据表可夺标关联搭建复杂数据模型一次建模&#xff0c;一键刷新DAX函数编写公式计算可将数据模型轻松移植到PBI和SQL中 1.将数据导入power pivot(power pivot------添加到数据模型) 2.导入其他表格&#xff0c;并有一定的关联 导入…

云原生周刊:Kubernetes v1.30 一瞥 | 2024.3.25

开源项目推荐 Retina Retina 是一个与云无关的开源 Kubernetes 网络可观测平台&#xff0c;它提供了一个用于监控应用程序运行状况、网络运行状况和安全性的集中中心。它为集群网络管理员、集群安全管理员和 DevOps 工程师提供可操作的见解&#xff0c;帮助他们了解 DevOps、…

jupyter notebook指定虚拟环境

要在 Jupyter notebook 中使用特定的虚拟环境&#xff0c;可以按照以下步骤操作&#xff1a; 1、首先&#xff0c;确保已经安装了 Jupyter notebook 和虚拟环境工具&#xff08;比如 virtualenv 或 conda&#xff09;。 2、在命令行中&#xff0c;激活你想要使用的虚拟环境。…

Redis数据类型bitMap以及解决的相关实际需求

在Redis数据库中&#xff0c;Bitmap&#xff08;位图&#xff09;是一种特殊的数据结构&#xff0c;它不是一个独立的数据类型&#xff0c;而是基于String类型实现的。Bitmap主要用于存储大量二进制位&#xff08;0或1&#xff09;的数据&#xff0c;这些位可以代表不同的状态或…

[高考] 数学题的一般解题思路

最近家里来了一位高中生&#xff0c;每天晩上辅导一下。虽然我不赞成现在的教育方式&#xff0c;但也脱不了随大流的现实。现根据这两周的教学经验总结一二&#xff0c;以便后续用的上&#xff01; 之前也经常听到有些学生说自己数学一点都不会。我觉的只要智力可以&#xff0…

【C语言】如何将数据写入文件?

如何将数据写入文件&#xff1f; 在C语言中&#xff0c;你可以使用标准库中的函数将数据写入文件。以下是一些常用的方法&#xff1a; 使用 fprintf() 写入格式化数据 fprintf() 函数类似于 printf()&#xff0c;但它将数据写入文件而不是输出到标准输出。 c复制代码 #inc…

ROS机器人入门第四课:话题通信

文章目录 ROS机器人入门第四课&#xff1a;话题通信一、话题通信概述&#xff08;一&#xff09;概念&#xff08;二&#xff09;作用 二、话题通信基本操作需求:分析:流程:&#xff08;一&#xff09;发布方解释一些关键的ROS函数和概念&#xff1a; &#xff08;二&#xff0…

苍穹外卖项目-01(开发流程,介绍,开发环境搭建,nginx反向代理,Swagger)

目录 一、软件开发整体介绍 1. 软件开发流程 1 第1阶段: 需求分析 2 第2阶段: 设计 3 第3阶段: 编码 4 第4阶段: 测试 5 第5阶段: 上线运维 2. 角色分工 3. 软件环境 1 开发环境(development) 2 测试环境(testing) 3 生产环境(production) 二、苍穹外卖项目介绍 …