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

news2024/11/15 2:09:32

题目描述

现需要在某城市进行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 = 0
        
        for 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 += 1
        
        return 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.coloradmin.cn/o/1481597.html

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

相关文章

使用MyBatisPlus实现向数据库中存储List类型的数据

使用MyBatisPlus实现向数据库中存储List类型的数据 问题描述 建表时&#xff0c;表中的这五个字段为json类型 但是在入库的时候既不能写入数据&#xff0c;也不能查询出数据。 解决方案&#xff1a; 1.首先明确&#xff0c;数据存入的时候是经过了数据类型转化&#xff0c…

Nacos配置

目录 启动nacos 项目步骤 Nacos服务分级存储模型​编辑 服务跨域集群调用问题 NacosRule负载均衡 服务实例的权重设置 环境隔离-namespace Nacos环境隔离 Nacos和Eureak对比 临时实例和非临时实例 Ncaos与Eureka的共同点 Nacos与Eureka的区别 Nacos配置管理 统一配…

Linux 系统安装/卸载 Nginx教程

优质博文&#xff1a;IT-BLOG-CN 一、安装Nginx 【1】首先通过Nginx官网确定需要安装的版本&#xff0c;如果Linux联网则直接在Linux服务上使用wget命令将Nginx安装包下载到/usr/local/目录下&#xff1a; [rootxxx local]# wget -c http://nginx.org/download/nginx-1.22.1.…

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

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

[HackMyVM]靶场 Adria

kali:192.168.56.104 主机发现 arp-scan -l 靶机:192.168.56.108 端口扫描 nmap -p- 192.168.56.108 开启了 22 80 139 445端口 进入web 编辑 /etc/hosts&#xff0c;把192.168.56.108 adria.hmv添加进去重新访问 里面没什么有用的东西&#xff0c;注册需要邮箱&#xff0c;…

LLM+RAG: 关于知识问答优化的思考总结

本文分享实践中对LLMRAG实现知识问答系统的相关调研和思考。 LLM的知识库问答有3种实现路径&#xff1a;RAG 或 微调&#xff0c;或两者结合。而RAG和微调都各有利弊&#xff0c;比如说&#xff1a; - RAG&#xff1a; 低成本易部署&#xff0c;适用于知识会更新的场景&#…

【兔子机器人】五连杆运动学解算与VMC(virtual model control)

VMC (virtual model control&#xff0c;虚拟模型控制) 是一种直觉控制方式&#xff0c;其关键是在每个需要控制的自由度上构造恰当的虚拟构件以产生合适的虚拟力。虚拟力不是实际执行机构的作用力或力矩&#xff0c;而是通过执行机构的作用经过机构转换而成。对于一些控制问题…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

PowerBI怎么修改数据库密码

第一步&#xff1a;点击转换数据 第二步&#xff1a;点击数据源设置 第三步&#xff1a;点击编辑权限 第四步&#xff1a;点击编辑 第五步&#xff1a;输入正要修改的密码就可以了

c++中使用lambda表达式的作用和用法

lambda表达式&#xff1a; 这是C11引入的一种新特性&#xff0c;它可以让您在需要定义函数对象的地方&#xff0c;直接编写一个匿名的、可以捕获上下文变量的函数体&#xff0c;非常适合用作回调函数、临时计算或定义小型函数对象。 lambda表达式与普通函数类似&#xff0c;也有…

linux系统如何安装nginx

首先下载nginx安装包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解压安装包 tar -zxvf nginx-1.23.1.tar.gz如果服务器没有wget&#xff0c;可以安装一下&#xff0c;有的话可以跳过 yum install -y wget 然后安装相关依赖 yum install -y gcc-c zlib zl…

pdf.js使用步骤

使用pdfjs 网页在线预览需要后端服务器支持 1、下载PDF.js 源码包 地址&#xff1a;PDF.js 2、解压源码包&#xff0c;将源码包放置到后端服务器 3、后端部署完成后 访问 viewer.html 类似上图 4、访问在线pdf文件 http://localhost:8081/web/viewer.html?filexxxx.pdf …

超好用的自动化测试工具——Python脚本

前言 ⾃动化测试会越来越受到重视 在移动互联⽹时代&#xff0c;对于质量的要求⽐PC时代⾼的多&#xff0c;⽽投⼊产出⽐最⾼的⾃动化测试&#xff0c;将会是⼤部分公司的⾸选⽅向&#xff0c;但需要严格掌握⼀门语⾔。 快速、高效的测试工具及脚本&#xff0c;能使程序猿的…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论&#xff08;4&#xff09; Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

2024腾讯云服务器优惠价格表又降价了,给同行干emo了

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

C++条件变量

概述 条件变量的使用&#xff0c;其实是一种多线程通知模式&#xff0c;当线程一使用完数据后&#xff0c;通过条件变量通知其他线程&#xff0c;C11后开始支持。 说明 条件变量必须配合mutex使用&#xff0c;确保并发访问的排他性 std::unique_lock<std::mutex> loc…

文献笔记:LINE: Large-scale Information Network Embedding

paper 看完√ code复现ing https://arxiv.org/pdf/1503.03578v1.pdf 本文研究了将非常大的信息网络嵌入到低维向量空间的问题&#xff0c;这在可视化、节点分类和链路预测等许多任务中都很有用。大多数现有的图形嵌入方法无法扩展到通常包含数百万个节点的现实世界信息网络。…

【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容 指针2.0 传值调用与传址调用传值调用传址调用 一维数组与指针理解数组名使用指针深入理解一维数组 二级指针指针数组二维数组与指针 传值调用与传址调用 在开始之前&#xff0c;我们需要先了解这个概念&#xff0c;后面才能够正常的学习…

成功解决‘OpenpyxlWriter’ object has no attribute ‘save’

成功解决‘OpenpyxlWriter’ object has no attribute ‘save’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…