[华为OD] C卷 5G网络 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站 200

本文主要是介绍[华为OD] C卷 5G网络 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站 200,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

现需要在某城市进行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 < = ?,0 

< Y < = N且X不等于丫,Z表示在X Y之间架设光纤的成本,其中0 < Z < 1 0 0 , 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

题解:

这种图节点的题目,优先考虑用并查集的思路进行解决。

关于并查集,可以参考:. - 力扣(LeetCode)

图论——并查集(详细版)_哔哩哔哩_bilibili

带权并查集_哔哩哔哩_bilibili

这三个视频看下大致就清楚并查集和带权并查集了。

并查集主要有三点,查找相同根find(x),就可以判断是否在同一组网络里面了

联合union(int num1,int num2) ,不同网络里面的num1和num2相连。

这个题目里面还要算最小的联通网络成本,所以我们要构建一个网络,这个数据里面先按照联通成本进行排序,然后轮询,计算两个节点是否在同一个网络,在的话,就不管,不在的话,那么成本就加上,然后并查集中两个节点进行连接。这个题还是比较有难度的

代码:

public class NetNode {private int root[];private int count;public NetNode(int size) {root = new int[size+1]; //这里点的序号是从1开始的,所以size要+1count = 0;for(int i =0;i<size+1;i++){root[i] = i;}}public int find(int x){if(x==root[x]){return x;}else {return root[x] = find(root[x]);}}public void union(int num1,int num2){root[find(num1)] = find(num2);count++;}public int getCount(){return count;}
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class FiveG {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int totalCount = Integer.valueOf(sc.nextLine());int m = Integer.valueOf(sc.nextLine());NetNode ne = new NetNode(totalCount);List<int[]> netWork = new ArrayList<>();for (int i = 0; i < m; i++) {String inputStr = sc.nextLine();String[] inputArr = inputStr.split(" ");int[] inputNum = new int[inputArr.length];for (int j = 0; j < inputArr.length; j++) {inputNum[j] = Integer.valueOf(inputArr[j]);}if (inputNum[3] == 1) {if (ne.find(inputNum[0]) != ne.find(inputNum[1])) {ne.union(inputNum[0], inputNum[1]);}} else {netWork.add(new int[]{inputNum[0], inputNum[1], inputNum[2]});}}netWork.sort(new Comparator<int[]>() {  //构建成本排序@Overridepublic int compare(int[] o1, int[] o2) {return o1[2] - o2[2];}});int result = 0;for (int i = 0; i < netWork.size(); i++) {System.out.println("i=" + i + " netWork.get(i)[0] = " + netWork.get(i)[0] +" netWork.get(i)[1]= " + netWork.get(i)[1]);if (ne.find(netWork.get(i)[0]) != ne.find(netWork.get(i)[1])) {ne.union(netWork.get(i)[0], netWork.get(i)[1]);result += netWork.get(i)[2];}if(ne.getCount() == totalCount - 1){break;}}System.out.println("totalCount = " + ne.getCount());if (ne.getCount() < totalCount - 1) {System.out.println(-1);return;}System.out.println(result);}
}

验证:

这篇关于[华为OD] C卷 5G网络 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站 200的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/952537

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五