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 x
    fa[x] = find(fa[x], fa)
    return fa[x]


def merge(x, y, fa):
    fx, fy = find(x, fa), find(y, fa)
    fa[fx] = fy


def 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 = 0
    for p in plans:
        if find(p.x, fa) != find(p.y, fa):
            cost += p.z
            merge(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加群”

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Docker和Springboot两种方式安装与部署Camunda流程引擎

文章目录 前言1、Docker安装1.1、拉取Camunda BPM镜像1.2、编写docker启动camunda容器脚本1.3、docker启动脚本1.4、访问验证 2、SpringBoot启动2.1、下载地址2.2、创建SpringBoot项目并配置基础信息2.3、下载SpringBoot项目并在idea中打开2.4、pom修改2.5、application.yml配置…

P1927 防护伞

题目传送门&#xff1a;P1927 防护伞 作业出了这道题&#xff0c;写一篇题解纪念一下。 这道题可以简化为“先枚举所有点&#xff0c;然后把这些点到另外点距离的最大距离和其他点比较&#xff0c;求出最小距离”。 这样说可能也听不懂&#xff0c;还可以再简化&#xff1a; …

深度学习环境配置常见指令

首先打开anaconda prompt&#xff0c;激活对应虚拟环境。 导入torch并获取对应版本 import torch torch.__version__导入torchvision并获取对应版本 import torchvision torchvision.__version__ 检查cuda是否可用 torch.cuda.is_available() 获取CUDA设备数 torch.cuda.…

85、字符串操作的优化

上一节介绍了在模型的推理优化过程中,动态内存申请会带来额外的性能损失。 Python 语言在性能上之所以没有c++高效,有一部分原因就在于Python语言将内存的动态管理过程给封装起来了,我们作为 Python 语言的使用者是看不到这个过程的。 这一点有点类似于 c++ 标准库中的一些…

CAN——创建一个数据库DBC文件

一、创建一个工程 file——new——can 500kbaud1ch 得到一个工程文件.cfg 二、实现两个节点通讯 can networks 三、创建数据库DBC tool——candbeditor——file——creatdatabase——cantemplate.dbc 1.建数值表 view——value tables——空白处右击add—— definition 定…

shell脚本编写基础实战

1.判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 第一步&#xff1a;配置邮件服务 yum install mailx -y ------安装邮件服务 设置邮箱服务相关配置 vim /etc/mail.rc 第…

【线程池项目(二)】线程池FIXED模式的实现

在上一篇【线程池项目&#xff08;一&#xff09;】项目介绍和代码展示 中&#xff0c;我们展示了线程池的两个版本实现&#xff0c;它们的代码在具体的实现细节上是优化过了的。下文提供的代码并非完整&#xff0c;也有很多地方尚需改善&#xff0c;但这些差异对理解整个项目而…

深度学习(17)--DataLoader自定义数据集制作

目录 DataLoader自定义数据集制作 1.从标注文件(txt文件)中读取数据和标签 2.分别把数据和标签存在两个list中 3.设置完整的图像数据路径 4.根据任务整合出一个数据处理类 5.数据预处理 6.使用定义好的类来实例化DataLoader 7.检查数据和标签是否对应 8.使用创建好的D…

【行业会议】优积科技应邀参加住建部模块建筑企业2023年工作座谈会

2023年3月2日&#xff0c;优积建筑科技发展&#xff08;上海&#xff09;有限公司&#xff08;以下简称“优积科技”&#xff09;应邀参加由住房和城乡建设部科技与产业化发展中心&#xff08;以下简称“住建部科技与产业化中心”&#xff09;组织召开的模块建筑企业2023年工作…

OpenCV 4基础篇| OpenCV图像基本操作

目录 1. 图像读取1.1 cv2.imread() 不能读取中文路径和中文名称1.2 cv2.imdecode() 可以读取中文路径和中文名称 2. 图像的显示2.1 openCV显示图像 cv2.imshow()2.2 matplotlib显示图像 plt.imshow() 3. 图像的保存 cv2.imwrite()4. 图像的复制4.1 img.copy()4.2 np.copy()4.3 …

基于java springboot的图书管理系统设计和实现

基于java springboot的图书管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

Ansible 简介及部署 基础模块学习 ansible部署rsync 及时监控远程同步

Ansible介绍&#xff1a; Ansible 是一个配置管理系统&#xff0c;当下最流行的批量自动化运维工具之一&#xff0c;它是一款开源的自动化工具&#xff0c;基于Python开发的配置管理和应用部署的工具。 Ansible 是基于模块工作的&#xff0c;它只是提供了一种运行框架&#xff…

【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

书生·浦语大模型实战营第四节课作业

基础作业 fintune过程 这里要注意下。 合并完参数的模型再进行网页部署时&#xff0c;需要用到InternLM源码&#xff0c;教程里面忽略了需要commit版本。通过以下命令转到所需版本&#xff0c;然后就可以看到web_demo.py。 cd InternLM git checkout 3028f07cb79e5b1d7342f4…

Servlet实现图片的上传和显示

本篇文章是在上一篇文章上改进而来 一、图片上传需要引用的jar包 链接&#xff1a;https://pan.baidu.com/s/17FLjlWlNEG5YnS_dl3C8WA 提取码&#xff1a;wbis 二、最后的结果 三、更改数据库增加图片路径字段path 四、前端页面增加图片上传按钮,和上传的复选框 代码 上传…

ChatGPT 4.0 升级指南

1.ChatGPT 是什么&#xff1f; ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人&#xff0c;它基于强大的语言处理模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;构建。它能够理解人类语言&#xff0c;可以为我们解决实际的问题。 1.模型规模…

vue+node.js美食分享推荐管理系统 io551

&#xff0c;本系统采用了 MySQL数据库的架构&#xff0c;在开始这项工作前&#xff0c;首先要设计好要用到的数据库表。该系统的使用者有二类&#xff1a;管理员和用户&#xff0c;主要功能包括个人信息修改&#xff0c;用户、美食类型、美食信息、订单信息、美食分享、课程大…

Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案

文章目录 1、问题描述2、原因分析3、解决方案3.1、方案一&#xff1a;降低mysql版本3.2、方案二&#xff1a;增加nullCatalogMeansCurrent参数&#xff08;推荐&#xff09; 4、总结 1、问题描述 需要在docker中&#xff0c;部署Camunda流程引擎。通过启动脚本camunda-platfor…

【LeetCode-337】打家劫舍III(动态规划)

目录 题目描述 解法1&#xff1a;动态规划 代码实现 题目链接 题目描述 在上次打劫完一条街道之后和一圈房屋后&#xff0c;小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为“根”。 除了“根”之外&#xff0c;每栋房子有且只有一个“父“…

JVM内存随着服务器内存的升高而升高问题排查

一、故障描述 公司测试环境和线上环境&#xff0c;都会有&#xff1a;JVM内存随着服务器内存的升高而升高 这种问题 二、排查 1、linux服务器上使用htop查看java项目内存占比&#xff0c;给最大最小推内存300m&#xff0c;但是实际上超出一倍 2、排查方案 a、通过后面的学习…