[华为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相连。

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

代码:

java 复制代码
public class NetNode {
    private int root[];
    private int count;

    public NetNode(int size) {
        root = new int[size+1]; //这里点的序号是从1开始的,所以size要+1
        count = 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;
    }
}
java 复制代码
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[]>() {  //构建成本排序
            @Override
            public 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);
    }
}

验证:

相关推荐
R²AIN SUITE17 小时前
多云或私有云环境怎么选项目管理工具?RainSuite等5种产品的8项部署验证
服务器·网络·数据库
2601_963282771 天前
寒地窄带通信工程实践:黑龙江哈尔滨对讲机选型、组网与合规运维总结
运维·服务器·网络
是真的小外套1 天前
网络安全实战第14期:Week2周末闯关
网络·安全·web安全
xbzb1 天前
OpenStack 网络管理(理论):Linux 网络虚拟化是 Neutron 的地基
linux·服务器·网络·openstack·network·neutron
QXWZ_IA1 天前
边坡监测预算有限时的建设顺序:虚拟基准站与成本账
网络·数据库
聪明蛋子哟1 天前
大模型应用“最后一公里”:从Prompt工程到MCP协议,如何实现跨系统的高可用集成?
网络·prompt
科创致远1 天前
ESOP 电子作业指导书 WiFi 网络应用实测报告
运维·服务器·网络
承渊政道1 天前
Linux网络学习【从NAT与代理服务理解网络转发、探索内网穿透原理、再到认识DNS与ICMP、最后动手部署并测试内网穿透】
linux·网络·学习·内网穿透·dns·nat
最强小杰1 天前
minimax-m3 突然报 HTTP 529 怎么办?连续重试为何更难恢复,退避时间该怎么算?
网络·网络协议·http·ai
程序员清风1 天前
AI 编程助手的权限边界:文件、命令、密钥与人工确认
运维·服务器·网络