5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述

现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间架设光纤的成本各不相同,且有些节点之间已经存在光纤相连,请你设计算法,计算出能联通这些站的最小成本是多少。
注意:基站的联通具有传递性,入基站A与基站B架设了光纤,基站B与基站C也架设了光纤,则基站A与基站C视为可以互相联通
输入描述:第一行输入表示基站的个数N,其中0<N<=20
第二行输入表示具备光纤直连条件的基站对的数目M,其中0<M<N*(N-1)/2
从第三行开始连续输入M行数据,格式为 X Y Z P,其中X Y表示基站的编号,0<X<=N,0<Y<=N且x不等于y,Z表示在X Y之间架设光纤的成本,其中0<Z<100,P表示是否已存在光纤连接,0表示未连接,1表示已连接
输出描述:如果给定条件,可以建设成功互联互通的5G网络,则输出最小的建设成本;
如果给定条件,无法建设成功互联互通的5G网络,则输出-1
示例1
输入:3
3
1 2 3 0
1 3 1 0
2 3 5 0
输出:4
说明:只需要在1,2以及2,3基站之间铺设光纤,其成本为3+1=4
示例2
输入:3
1
1 2 5 0
输出:-1
说明:3基站无法与其他基站连接,输出-1
示例3
输入:3
3
1 2 3 0
1 3 1 0
2 3 5 1
输出:1
说明:2,3基站已有光纤相连,只有要再1,3站点之间铺设光纤,其成本为1

解题思路

这个问题可以使用最小生成树(Minimum Spanning Tree)的思想来解决,Kruskal算法是一种常用的实现方式。下面是解题思路:

  • 将所有基站之间的光纤连接按照成本从小到大排序,初始化一个并查集(Union-Find)用于记录基站的联通情况。
  • 遍历排序后的光纤连接,逐个连接基站,如果连接后不形成环(即两个基站不在同一个集合中),则将它们合并,累加连接的成本。
  • 当联通的基站数量达到N-1时,即所有基站都联通,停止连接。
  • 如果最终联通的基站数量不等于N-1,说明无法建设成功互联互通的5G网络,输出-1;否则输出累加的连接成本。

题解代码

Python题解代码

class Solution:def findCircleNum(self, isConnected: List[List[int]]) -> int:cities = len(isConnected)visited = set()provinces = 0for i in range(cities):if i not in visited:Q = collections.deque([i])while Q:j = Q.popleft()visited.add(j)for k in range(cities):if isConnected[j][k] == 1 and k not in visited:Q.append(k)provinces += 1return provinces

JAVA题解代码

class Solution {public int findCircleNum(int[][] isConnected) {int ans = 0, n = isConnected.length;boolean[] visit = new boolean[n];for(int i = 0; i < n; ++i){if(!visit[i]){ans++;bfs(i, visit, isConnected);}}return ans;}public void bfs(int i, boolean[] visit, int[][] isConnected){for(int j = 0; j < isConnected.length; ++j){if(isConnected[i][j] == 1 && !visit[j]){visit[j] = true;bfs(j, visit, isConnected);}}}
}

C/C++题解代码

class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int cities = isConnected.size();vector<int> visited(cities);int provinces = 0;queue<int> Q;for (int i = 0; i < cities; i++) {if (!visited[i]) {Q.push(i);while (!Q.empty()) {int j = Q.front(); Q.pop();visited[j] = 1;for (int k = 0; k < cities; k++) {if (isConnected[j][k] == 1 && !visited[k]) {Q.push(k);}}}provinces++;}}return provinces;}
};

JS题解代码


var findCircleNum = function(isConnected) {const cities = isConnected.length;const visited = new Set();let provinces = 0;const queue = new Array();for (let i = 0; i < cities; i++) {if (!visited.has(i)) {queue.push(i);while (queue.length) {const j = queue.shift();visited.add(j);for (let k = 0; k < cities; k++) {if (isConnected[j][k] === 1 && !visited.has(k)) {queue.push(k);}}}provinces++;}}return provinces;
};

代码OJ评判结果

通过测试点

代码讲解

Python题解代码解析:

这段Python代码是用于解决一个图的连通性问题。具体来说,该问题是要求找出城市之间的连通分量个数,其中城市之间的连通关系由isConnected矩阵表示。

  • cities表示城市的总数,即矩阵的行数和列数。
  • visited是一个集合,用于记录已经访问过的城市。
  • provinces用于记录连通分量的数量。
  • 通过遍历城市,对于每个未访问的城市,使用广度优先搜索(BFS)的方式找出与该城市直接或间接相连的所有城市,将它们标记为已访问,并将连通分量数量加一。

最终返回连通分量的数量。

JAVA题解代码解析:

该Java代码与Python代码功能相同,同样是解决城市之间的连通性问题。主要结构和思路如下:

  • findCircleNum方法用于返回连通分量的数量。
  • 使用boolean数组visit记录城市的访问状态。
  • 使用bfs方法进行广度优先搜索,找出与当前城市直接或间接相连的所有城市,将它们标记为已访问。
  • 遍历所有城市,如果某城市未被访问,则进行广度优先搜索,同时将连通分量数量加一。

最终返回连通分量的数量。

C/C++题解代码解析:

这段C++代码与前两段代码实现的功能相同,解决城市之间的连通性问题,使用了BFS算法。

  • findCircleNum方法返回连通分量的数量。
  • 使用vector<int>数组visited记录城市的访问状态。
  • 使用queue<int>数据结构进行广度优先搜索,找出与当前城市直接或间接相连的所有城市,将它们标记为已访问。
  • 遍历所有城市,如果某城市未被访问,则进行广度优先搜索,同时将连通分量数量加一。

最终返回连通分量的数量。

JS题解代码解析:

这段JavaScript代码与前三段代码实现的功能相同,同样是解决城市之间的连通性问题,使用了BFS算法。

  • findCircleNum函数返回连通分量的数量。
  • 使用Set对象visited记录城市的访问状态。
  • 使用数组queue进行广度优先搜索,找出与当前城市直接或间接相连的所有城市,将它们标记为已访问。
  • 遍历所有城市,如果某城市未被访问,则进行广度优先搜索,同时将连通分量数量加一。

最终返回连通分量的数量。

寄语

🚀✨ 朋友,希望你的华为OD机试就像是一场轻松的技术party!愿你的代码如同畅快的音符,跳跃在键盘上,最后弹奏出一曲高分之歌。加油,你是技术舞台上的巨星!通过机试,就像是风轻云淡,轻轻松松就把高分收入囊中。祝愿你的编程之旅一路顺风,破风前行,每一行代码都是成功的注脚!🌈💻

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引失效与MySQL8新添加的索引特性

目录 MySQL索引失效的场景 数据表和索引的准备 1 .联合索引不满足最左匹配原则 2.对索引进行表达式计算 3.对索引使用函数 4.对索引隐式类型转换 5.like的不当使用 6.where子句中的 or 7.not int导致索引部分失效 MySQL8新增的索引特性 函数索引 索引跳跃扫描(Index…

USLE模型-LS因子的计算

目录 计算坡度计算填洼计算流向计算水流长度计算水平投影![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/75e015b2d6874ce9b6652f2b8730b90f.png)计算可变的坡度指数m计算坡长因子L计算坡度因子S计算LS因子参考视频 计算坡度 准备好30米分辨率的dem 计算填洼 计…

【Unity】如何设置Unity脚本的执行顺序?

在 Unity 编辑器中设置脚本执行顺序 在 Unity 中&#xff0c;如果有多个脚本&#xff0c;并且它们之间的执行顺序很重要&#xff0c;可以通过编辑器设置来确保它们按照自己期望的顺序执行。这对于确保某些脚本在其他脚本之前执行非常有用。在这篇文章中&#xff0c;将向会展示如…

农产品质量追溯系统—简介

概要 农产品质量安全事关广大人民群众的食用安全和身体健康。解决农产品质量安全问题,需要从源头开始抓好、抓实农产品安全监管工作。通过建立从产地到市场的全程质量控制系统和追溯制度,对农产品产地环境、生产过程、产品检测、包装盒标识等关键环节进行监督管理,提高广大…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章&#xff1a; 封装窗口工具类【1】雏形 我们思考一下窗口间的关系&#xff0c;窗口创建和销毁的一些动作&#xff0c;例如父子窗口&#xff0c;窗口组合等等&#xff0c;还有…

Redis--持久化机制详解

什么是redis持久化&#xff1f; Redis持久化是将内存的数据持久化到磁盘上&#xff0c;防止Redis宕机或者断点的时候内存中的数据丢失&#xff0c;把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

Vue+SpringBoot打造天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

JAVA的学习日记

JAVA的学习日记&#xff08;2024.3.1&#xff09;&#xff08;b站韩顺平老师课程学习笔记版&#xff09; ps:捡起忘光光的Java语言 Sublime //1. public是公有&#xff0c;class是类 //2. public class Hello表示Hello是一个类&#xff0c;是一个public公有的类 //3. Hello{…

G8-ACGAN理论

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、对比分析 前面的文章介绍了CGAN&#xf…

(定时器/计数器)中断系统(详解与使用)

讲解 简介 定时器/计数器 定时器实际上也是计数器,只是计数的是固定周期的脉冲 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值…

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网…

Java SPI:Service Provider Interface

SPI机制简介 SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是从JDK6开始引入的&#xff0c;一种基于ClassLoader来发现并加载服务的机制。 一个标准的SPI&#xff0c;由3个组件构成&#xff0c;分别是&#xff1a; Service&#xff1a;是一个公开的接口…