当前位置: 首页 > news >正文

华为od-C卷200分题目6 - 5G 网络建设

华为od-C卷200分题目6 - 5G 网络建设

题目描述
现需要在某城市进行 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

样例输入 复制
3
3
1 2 3 0
1 3 1 0
2 3 5 0
样例输出 复制
4
提示
只需要在 1,2 以及 2,3 基站之间铺设光纤,其成本为 3+1=4

import java.util.*;class Point {int parent;int size = 1;int cost = 0;public Point(int parent) {this.parent = parent;}
}public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int x, y, z, p;Point[] points = new Point[n + 1];for (int i = 1; i < points.length; i++) {points[i] = new Point(i);}ArrayList<int[]> list = new ArrayList<>();HashSet<Integer> set = new HashSet<>();for (int i = 0; i < m; i++) {x = sc.nextInt();y = sc.nextInt();z = sc.nextInt();p = sc.nextInt();set.add(x);set.add(y);if (p == 1) {add(points, x, y, 0);} else {list.add(new int[]{x, y, z});}}Collections.sort(list, Comparator.comparingInt(o -> o[2]));for (int[] ints : list) {add(points, ints[0], ints[1], ints[2]);}int parent = -1;for (int i = 1; i <= n; i++) {if (parent == -1) {parent = getParent(points, i);}if (parent != getParent(points, i)) {System.out.println(-1);return;}}System.out.println(points[parent].cost);}private static void add(Point[] points, int x, int y, int cost) {int parentX = getParent(points, x);int parentY = getParent(points, y);if (parentY == parentX) {return;}if (points[parentY].size <= points[parentX].size) {points[parentY].parent = points[parentX].parent;points[parentX].size += points[parentY].size;points[parentX].cost += cost + points[parentY].cost;} else {points[parentX].parent = points[parentY].parent;points[parentY].size += points[parentX].size;points[parentY].cost += cost + points[parentX].cost;}}public static int getParent(Point[] points, int index) {while (index != points[index].parent) {index = points[index].parent;}return index;}
}

思路:主要就是并查集的思想,不断更新父节点,比较时比较size,哪个集合多哪个就作为父,先排序,按照成本排序,如果已经连接则跳过

http://www.lryc.cn/news/394599.html

相关文章:

  • 步进电机(STM32+28BYJ-48)
  • Node.js介绍 , 安装与使用
  • JavaEE初阶-网络原理1
  • leetcode秋招冲刺 (专题16--18)
  • 学懂C#编程:实用方法——string字符串指定连接符拼接之 string.Join 的详细用法
  • Javascript常见数据结构和设计模式
  • 【ChatGPT】全面解析 ChatGPT:从起源到未来
  • html+css+js贪吃蛇游戏
  • 新手必学:掌握Excel中这些常用公式,轻松提升数据处理能力
  • 经济寒冬:竞品凶猛,你的产品如何求生?
  • 信号量——Linux并发之魂
  • 自动驾驶中的逆透视变换(Inverse Perspective Mapping,IPM)详解
  • Python地震波逆问题解构算法复杂信号分析
  • C语言 -- 深入理解指针(二)
  • HTTP协议详解
  • 一年时间业绩增长2倍,茅台保健酒业公司在川销售的“三板斧”
  • 土豆炒肉做法
  • VPS拨号服务器:独享的高效与安全
  • 网络安全设备——防火墙
  • Redis 管道技术
  • 使用vue3-treeselect问题
  • 每日直播分享车载知识:硬件在环、UDS诊断、OTA升级、TBOX测试、CANoe、ECU刷写、CAN一致性测试:物理层、数据链路层等
  • flex布局---子元素未设置高度,默认与父元素同高---侧轴方向的拉伸
  • 资源分享—2021版三调符号库
  • 解决selenium手动下载驱动问题
  • 使用fifo IP核,给fifo写数据,当检测到ALMOST_EMPTY时,为什么不能立即赋值
  • 【Python123题库】#汽车迷 #编写函数输出自除数 #身份证号基本信息
  • 普通人怎么利用GPT赚钱之SEO优化内容
  • LeetCode热题100刷题8:54. 螺旋矩阵、73. 矩阵置零、48. 旋转图像
  • 景联文科技打造高质量图文推理问答数据集,赋能大语言模型提升推理能力