目录

题目

思路

Code


题目

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

思路

1:可以用并查集来解决这种图联通类型的问题。

2:并查集属于数据结构的一种 是高等数据结构最基础的一部分,主要分为普通并查集 种类并查集以及带权并查集。它是一种用于管理元素所属集合的数据结构,这里的集合我们可以理解为一颗数 每个元素都是树上的有一个分叉,顺着分叉我们可以找到 这棵树的根 也就是这个集合里所有元素的“祖先”。

3:主要操作:
查找(find): 用于查找每棵树的根 也就是这个集合所有元素的祖先 这样就可以判断两个元素是否属于一个集合 就是看两个元素的祖先是否相同。

合并(merge):用于合并两颗树,将两个集合合并。

求大小(size):可以统计每个集合元素的个数。
可以看下这篇文章,有很多样例的介绍:并查集(java)_并查集java实现-CSDN博客

4:具体并查集模板是参考的leetcode大佬的写法:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

编辑

Code

# coding:utf-8
#JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
import functools
import sys
from collections import Counter, defaultdict
import copy
from itertools import permutations
import re
import math
import sys
from queue import Queue
#https://leetcode.cn/problems/number-of-provinces/solutions/1975727/li-kou-547-bing-cha-ji-si-lu-jiang-jie-b-u9qh/
class UF:
    def __init__(self, n):
        self.root = [i for i in range(n+1)]
        self.rank = [1 for i in range(n+1)]
        self.count = 0
 
    def find(self,x):
        if (x == self.root[x]):
            return x
        
        self.root[x] = self.find(self.root[x])
        return self.root[x]
    
    def union(self,x, y):
        self.root[self.find(x)] = self.find(y)
        self.count+=1
    
    def get_count(self):
        return self.count
 
n = int(input())
m = int(input())
uf = UF(n)
networks = []
for i in range(m):
    data = [int(x) for x in input().split(" ")]
    
    if (data[3] == 1):
        if (uf.find(data[0]) != uf.find(data[1])):
            uf.union(data[0], data[1])
    else:
        networks.append([data[0],data[1],data[2]])
    
 
networks = sorted(networks, key=lambda x : x[2])
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.


【华为od机试真题Python+JS+Java合集】【超值优惠】:Py/JS/Java合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java】:Java真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群:830285880】