5G网络建设 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

现需要在某城市进行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站点2向铺设,其成本为1

题解

最小生成树的问题,可以使用 Kruskal 算法进行求解。

  1. 初始化并查集,每个基站初始时属于一个独立的集合。
  2. 将已经存在光纤连接的基站合并到同一个集合中。
  3. 将未连接的光纤按照成本从小到大排序。
  4. 遍历排序后的光纤,将两个基站连接,如果两个基站已经属于同一个集合,则不连接。
  5. 判断所有基站是否属于同一个集合,如果是,则输出总成本,否则输出-1。

Kruskal 算法的步骤:

  1. 初始化: 将每个顶点视为一个独立的集合,每个集合中只包含一个顶点。将图中的所有边按照权值从小到大排序。
  2. 遍历边: 从权值最小的边开始遍历,如果该边连接的两个顶点不在同一个集合中,则选择这条边,并将这两个顶点所在的集合合并为一个集合。重复此步骤直到所有顶点都在同一个集合中。
  3. 输出结果: 最终得到的就是最小生成树。

Java

import java.util.Comparator;
import java.util.Scanner;
import java.util.Vector;
/*** @author code5bug*/
class Main {static int[] fa;static int find(int x) {if (fa[x] == x) return x;return fa[x] = find(fa[x]);}static void merge(int x, int y) {int fx = find(x), fy = find(y);fa[fx] = fy;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 基站个数, 具备光纤直连条件的基站对的数目int N = scanner.nextInt(), M = scanner.nextInt();fa = new int[N + 1];for (int i = 1; i <= N; i++) {fa[i] = i;}Vector<Plan> plans = new Vector<>();for (int i = 0; i < M; i++) {Plan p = new Plan();p.x = scanner.nextInt();  p.y = scanner.nextInt();p.z = scanner.nextInt();  p.p = scanner.nextInt();// 已经存在光纤if (p.p == 1) {merge(p.x, p.y);} else {plans.add(p);}}plans.sort(Comparator.comparingInt(a -> a.z));int cost = 0;for (Plan p : plans) {// 没有连接则连接上if (find(p.x) != find(p.y)) {cost += p.z;merge(p.x, p.y);}}// 所有基站是否连接boolean allConnected = true;for (int i = 1; i <= N; i++) {if (find(i) != find(1)) {allConnected = false;break;}}System.out.println(allConnected ? cost : -1);}
}class Plan {int x, y; // 基站的编号int z, p; // 架设光纤的成本, 是否已存在光纤连接,0表示未连接1表示已连接
}

Python

class Plan:def __init__(self, x, y, z, p):self.x = x  # 基站的编号self.y = y  # 基站的编号self.z = z  # 架设光纤的成本self.p = p  # 是否已存在光纤连接,0表示未连接,1表示已连接def find(x, fa):if fa[x] == x:return xfa[x] = find(fa[x], fa)return fa[x]def merge(x, y, fa):fx, fy = find(x, fa), find(y, fa)fa[fx] = fydef main():N, M = int(input()), int(input())fa = [i for i in range(N+1)]plans = []for _ in range(M):x, y, z, p = map(int, input().split())if p == 1:merge(x, y, fa)else:plans.append(Plan(x, y, z, p))plans.sort(key=lambda p: p.z)cost = 0for p in plans:if find(p.x, fa) != find(p.y, fa):cost += p.zmerge(p.x, p.y, fa)all_connected = all(find(i, fa) == find(1, fa) for i in range(1, N+1))print(cost if all_connected else -1)if __name__ == "__main__":main()

C++

#include <bits/stdc++.h>
using namespace std;struct plan{int x, y; // 基能的编号int z, p; // 架设光纤的成本, 是否已存在光纤连接,0表示未连接1表示已连接
};int fa[30];int find(int x){if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}void merge(int x, int y){int fx = find(x), fy = find(y);fa[fx] = fy;
}int main(){int N, M;// 基站个数, 具备光纤直连条件的基站对的数目cin >> N >> M;for(int i=1;i<=N;i++) fa[i] = i;vector<plan> plans;for(int i=0;i<M;i++){plan p;cin >> p.x >> p.y >> p.z >> p.p;// 已经存在光纤if(p.p == 1) merge(p.x, p.y);else plans.push_back(p);}sort(plans.begin(), plans.end(), [](plan a, plan b){return a.z < b.z;});int cost = 0;for(auto& p : plans){// 没有连接则连接上if(find(p.x) != find(p.y)){cost += p.z;merge(p.x, p.y);}}// 所有基站是否连接bool all_connected = true;for(int i=1;i<=N;i++){if(find(i) != find(1)){all_connected = false;break;}}cout << (all_connected ? cost : -1) << endl;return 0;
}

相关练习题

题号题目难易
LeetCode 15841584. 连接所有点的最小费用中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)

上篇文章介绍了深度Depth&#xff0c;这篇文章介绍下IP2P&#xff08;InstructP2P&#xff09;, 通俗理解就是图生图&#xff0c;给原有图加一些效果,比如下图&#xff0c;左边为原图&#xff0c;右边为增加了效果的图&#xff1a; 文章目录 一、选大模型二、写提示词三、基础参…

计算机网络:思科实验【1-访问WEB服务器】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容熟悉仿真软件访问WEB服务器 实验体会总结…

Python实战:xlsx文件的读写

Python实战&#xff1a;xlsx文件的读写 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &#…

中断系统(详解与使用)

讲解 简介 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 假设一个人在家看电视,这时候突然门铃响了,这个人此时就要停止看电视去开门,然后关上门后继续回来…

PyTorch:transforms.Normalize()函数详解

PyTorch&#xff1a;transforms.Normalize()函数详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和…

考研西电(833),考什么?计算机组成原理第一章要点

目录 1.1 计算机的发展历史&#xff08;必须要了解的知识点&#xff09;1.1.1 发展历史1.1.2 摩尔定律★★ 1.2 计算机的基本组成1.2.1 硬件系统1.2.2 软件系统1.2.3 指令集系结构1.2.4 高级语言程序的执行过程 1.3 计算机的层次概念1.3.1 计算机系统的层次结构1.3.2 计算机体系…

React18源码: reconcliler启动过程

Reconcliler启动过程 Reconcliler启动过程实际就是React的启动过程位于react-dom包&#xff0c;衔接reconciler运作流程中的输入步骤.在调用入口函数之前&#xff0c;reactElement(<App/>) 和 DOM对象 div#root 之间没有关联&#xff0c;用图片表示如下&#xff1a; 在启…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛&#xff01;( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中&#xff0c;我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本&#xff0c;希望能为大家在…

C++基础知识(六:继承)

首先我们应该知道C的三大特性就是封装、继承和多态。 此篇文章将详细的讲解继承的作用和使用方法。 继承 一个类&#xff0c;继承另一个已有的类&#xff0c;创建的过程 父类(基类)派生出子类(派生类)的过程 继承提高了代码的复用性 【1】继承的格式 class 类名:父类名 {}; 【…

机器视觉选型:如何选择一个合适光源控制器

在机器视觉系统中&#xff0c;选择合适的光源及其控制器对于确保高质量图像捕获和处理至关重要。本文会提供一些建议&#xff0c;以便于引导您了解如何基于应用需求选择最合适的光源和光源控制器。 1. 理解光源的功率需求 不同类型的光源具有不同的功率需求&#xff0c;这直接…

汽水分离器——矿用分离过滤装置

去找一个奋发向上能带动你的人&#xff0c;去找一个像太阳一样的人&#xff0c;帮你晒晒全部不值一提的迷茫! 一、结构&#xff1a; 气水分离器又称气水分离过滤器&#xff0c;主要由&#xff1a;进口、筒体、滤芯连接件、滤芯、密封圈、阀门连接件、出气管、排水口、压力表等…

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计 便捷记账 便捷的记账方式&#xff0c;支持多种记账类型&#xff0c;快捷切换账本等 多账本 支…

JavaScript的内存管理与垃圾回收

前言 JavaScript提供了高效的内存管理机制&#xff0c;它的垃圾回收功能是自动的。在我们创建新对象、函数、原始类型和变量时&#xff0c;所有这些编程元素都会占用内存。那么JavaScript是如何管理这些元素并在它们不再使用时清理它们的呢&#xff1f; 在本节中&#xff0c;…

汽车大灯尾灯破裂修复用什么胶?

汽车大灯尾灯破裂可以使用硅酮玻璃胶或者环氧树脂胶进行修复。 硅酮玻璃胶的优点主要包括&#xff1a; 粘接力强&#xff1a;硅酮玻璃胶具有很强的粘接力&#xff0c;可以有效地将裂缝两侧的材料紧密粘合在一起。拉伸强度大&#xff1a;硅酮玻璃胶固化后形成的固体具有较高的…

VM-UNet: Vision Mamba UNet for Medical Image Segmentation

VM-UNet: 基于纯 Mamba 架构的医学图像分割模型 论文地址&#xff1a;https://arxiv.org/abs/2402.02491 项目地址&#xff1a;https://github.com/JCruan519/VM-UNet Abstract 在医学图像分割领域&#xff0c;基于CNN和基于Transformer的模型都得到了广泛的探索。然而&#…

基于Android的记单词App系统的研究与实现,附附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Mamba 作者谈 LLM 未来架构

文章目录 前言 1、为什么注意力机制有效&#xff1f; 2、注意力计算量呈平方级增长 3、Striped Hyena 是个什么模型&#xff1f; 4、什么是 Mamba? 5、Mamba 硬件优化 6、2024年架构预测 7、对 AI 更多的预测 本片文章来自【机器之心】对Mamba作者进行采访所进行的编译整理。 …

springboot+vue项目部署配置开机自启动

1.前端部属 下载nginx解压&#xff0c;在nginx\conf下找到nginx.conf 添加如下代码 server {listen 8081;server_name localhost;charset utf-8;location / {root F:/1ceshi/dist; #前端打包路径try_files $uri $uri/ /index.html;index index.html index.htm;}l…

【动态规划】【前缀和】【推荐】2463. 最小移动总距离

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 2463. 最小移动总距离 X 轴上有一些机器人和工厂。给你一个整数数组 robot &#xff0c…

2.5G/5G/10G高速率网络变压器(网络隔离变压器)产品介绍(1)

Hqst华轩盛(石门盈盛)电子导读&#xff1a;高速率/2.5G 的带POE插件&#xff08;DIP&#xff09;款千兆双口网络变压器2G54801DP特点 一 ﹑2.5G高速率网络变压器&#xff08;网络隔离变压器&#xff09;&#xff1a;2G54801DP外观与尺寸 2G54801DP这颗产品尺寸为&#xff1a;长…