5G网络建设--并查集--最小生成树

这篇具有很好参考价值的文章主要介绍了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

用例1
输入
3
3
1 2 3 0
1 3 1 0
2 3 5 0
输出
4
说明
只需要在1,2以及1,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基站之间铺设光纤,其成本为1文章来源地址https://www.toymoban.com/news/detail-854673.html

import java.util.*;

// 最小生成树
/*其他知识点:
 在一个list中修改node数据也会引起另一个list的node数据修改
 list中存放的是node的地址引用
*/
class Node {
    // 这里用node表示直连线路
    public int x;
    public int y;
    public int z;
    public boolean p;

    public Node(int x, int y, int z, boolean p) {
        this.x = x;
        this.y = y;
        this.z = z;
        this.p = p;
    }

    public Node(Node other){
        this.x = other.x;
        this.y = other.y;
        this.z = other.z;
        this.p = other.p;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int M = in.nextInt();
        int sum = 0;
        // 初始建设成本 为 0
        if(M < N-1){
            // 如果 已知可直连的 数目 M 小于 N-1  则不可能连通
            // 最小生成树 N-1 条边 保证连通
            System.out.println(-1);
            return;
        }
        String temp = in.nextLine();
        // ArrayList<String> data = new ArrayList<String>();
        ArrayList<Node> nodeList = new ArrayList<Node>();
        // 全部线路
        while (M>0) {
            // 输入M行
            M--;
            String tempString = in.nextLine();
            //System.out.println("tempString: " + tempString);
            String[] charString = tempString.split(" ");
            if (charString.length == 4) {
                if(charString[3].equals("0")){
                    Node node = new Node(Integer.valueOf(charString[0]).intValue(),
                        Integer.valueOf(charString[1]).intValue(),
                        Integer.valueOf(charString[2]).intValue(),
                        false);                
                    nodeList.add(node);
                }
                else{
                    Node node = new Node(Integer.valueOf(charString[0]).intValue(),
                        Integer.valueOf(charString[1]).intValue(),
                        0,
                        true);
                    //已链接线路的长度 置 0
                    nodeList.add(node);
                }
                // 这里没有抛出异常 默认 给定的数据就是数字的字符串了
            } else {
                System.out.println(-1);
                return;
            }
            // data.add(tempString);
            // System.out.println(tempString);
        }

        // 运行到这里 已经默认 M >= N - 1
        // 需要求出最小生成树
        // 给list排序
        nodeList.sort(new Comparator<Node>(){
            @Override
            public int compare(Node node1,Node node2){
                return node1.z-node2.z;
                // 此时 按照 z 递增序列 重排list
            } 
        });
        //测试nodelist是否正确
        /*for (Node node : nodeList) {
            System.out.println(node.x + " " + node.y + " " + node.z + " " + node.p);
        }*/

        UnionFind unionFind = new UnionFind(N+1);
        // 0 号空缺不用  从 1 - N

        for(Node node:nodeList){
            if(!unionFind.connected(node.x,node.y)){
                unionFind.union(node.x,node.y);
                sum+=node.z;
                if(unionFind.getCount() == 2){
                    // 0 号元素 没有到 故当连通分量为 2 的时候 有效连通分量只有 1个 
                    // 最小生成树构造完成
                    break;
                }
            }
        }
        if(unionFind.getCount()==2){
            // 若没有形成 最小生成树 也会最终从循环中出来 要判断是否形成了最小生成树
             System.out.print(sum);
        }
        else{
            System.out.print(-1);
        }
    }
}


class UnionFind{
    // 并查集 N个元素
    private int n;

    private int[] parent;
    //父指针数组

    private int count;

    public UnionFind(int n){
        this.n = n;
        this.parent = new int[n];

        for(int i=0;i<n;i++){
            parent[i] = i;
            // 初始时 父指针指向自己
        }

        this.count = n;
        // 初始时 连通分量个数等于 元素个数
    }

    public void union(int p, int q){
        int rootP = find(p);
        int rootQ = find(q);

        if(rootP == rootQ){
            // 已经位于同一个连通分量之中
            return;
        }
        else{
            // union操作
            parent[rootP] = rootQ;
            // rootP 的父指针指向 rootQ
            this.count--;
            // 连通分量个数减一
        }
    }

    public int find(int element){
        // 找根节点
        if(parent[element] != element){// 当 element自己不是根节点的时候  
            // 递归函数
            parent[element] = find(parent[element]);
            // find 找 element 的上层节点的上层节点
            // 以此类推
            // 当找到根节点root 的时候parent[次节点] = find(parent[次节点]) = find(root) = root
            // parent[次次节点] = find(parent[次次节点]) = find(次节点)
            // 由于 次节点!=parent[次节点] 则parent[次次节点] = find(次节点) = parent[次节点] = root
            // 以此类推

            // 则将 实际树高设置为 2  根节点root直接与所有子节点相连
        } 
        return parent[element];
    }

    public boolean connected(int p, int q){
        // 判断 p q 是否在同一个连通分量当中
        int rootP = find(p);
        int rootQ = find(q);
        return rootP == rootQ;
    }

    public int getCount(){
        // 返回连通分量个数
        return this.count;
    }
}

到了这里,关于5G网络建设--并查集--最小生成树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法每日一练]-图论(保姆级教程篇7 最小生成树 ,并查集模板篇)#村村通 #最小生成树

    目录 题目:村村通 并查集  题目:最小生成树 kruskal算法 prim算法          先引入问题: 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的 任意两个之间都可以通信 ,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要 使铺设光

    2024年02月04日
    浏览(64)
  • 求无向图的最小生成树——Kruskal算法(超详细)【并查集,python实现】

    以如下无向图为例,求最小生成树及其权值。 补充知识点: 最小生成树(不官方的解释):包含所有节点,保持整个图连通,所有边权值之和最小。 1、补充在前 (1)图的存储 采用二维列表存储(点,点,边的权值) (2)顶点转换 为了便于计算,将字母A ~ G用数字0 ~ 6代

    2024年02月04日
    浏览(32)
  • 【基础建设】浅谈企业网络安全运营体系建设

    引言 在网络安全环境复杂又严峻的当前,国内各大企业已开始组建自己的网络安全团队,加强企业自身安全能力建设,朝着网络安全运营一体化迈进。但企业安全运营也已逐步从被动式转变为主动式,成为将人、管理与技术结合,全面覆盖网络安全监测、预警、防护、检测、

    2024年02月09日
    浏览(33)
  • 工控网络安全分支-电力行业网络安全建设

    长期以来,传统工业系统的设备专有性与天然隔离性使得人们忽视了信息安全隐患的存在,管理者与工程师们往往将安全关注的焦点和资金预算都投放在设备安全和生产安全方面,预防发生工业事故造成人员、财产、或环境损失。然而,信息技术的发展已经打破了传统的“物

    2024年02月03日
    浏览(58)
  • 网络建设 之 React数据管理

    React作为一个用于构建用户界面的JavaScript库,很多人认为React仅仅只是一个UI 库,而不是一个前端框架,因为它在数据管理上是缺失的。在做一个小项目的时候,维护的数据量不多,管理/维护数据用useState/useRef就足够了;可是当项目变大,需要的数据量成百上千,然后就会发

    2024年02月07日
    浏览(29)
  • 银行网络安全实战对抗体系建设实践

    党的十八大以来,将网络安全提升到前所未有的新高度,银行牢牢把握国家网络安全战略目标,已加强自身建设,建立了较为完善的安全防护体系。同时随着国际网络安全攻防对抗升级,银行转变思路、主动作为,从被动防守向主动防御、动态防御转型,聚焦传统攻防演练的

    2024年01月21日
    浏览(40)
  • 网络综合布线实训室建设方案

    网络综合布线系统是为了满足数据通信需求而设计和建立的一套基础设施。它提供了数据传输、信号传输和电力供应的基础结构,支持各种网络设备和终端设备之间的连接。 网络综合布线系统通常包括以下组成部分: 1) 数据通信线缆:网络综合布线系统使用各种类型的通信

    2024年02月12日
    浏览(45)
  • 网络安全合规-数据安全治理体系建设

    一、数据安全治理体系建设思路: 一级文档。由决策层认可、面向组织的数据安全方针,通常应包括组织数据安全工作的总体目标、基本原则、数据安全决策机构设置与职责划分等。 二级文档。根据数据安全方针的要求,对组织数据安全工作各关键领域的管理要求做出具体

    2024年02月01日
    浏览(31)
  • 洞悉安全现状,建设网络安全防护新体系

    一、“网络攻防演练行动“介绍 国家在2016年发布《网络安全法》,出台网络安全攻防演练相关规定:关键信息基础设施的运营者应“制定网络安全事件应急预案,并定期进行演练”。同年“实战化网络攻防演练行动”成为惯例。由公安部牵头,每年举办一次,针对全国范围

    2024年02月14日
    浏览(59)
  • 网络安全:数字中国建设和发展的基石

    数字中国的概念已经深入人心,随着互联网技术的快速发展,我们的生活已经离不开数字技术。然而,在享受数字技术带来的便利的同时,我们也面临着越来越多的网络安全威胁。网络安全不仅关系到个人信息的安全,更关系到国家安全和社会稳定。 网络安全是指通过采取必

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包