‘’’
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
‘’’
def func_5Gjianshe(n,mlist):
fa=list(range(n))
def find_set(p):
if fa[p]!=p:
fa[p]=find_set(p)
return fa[p]
else:
return fa[p]
def union_set(n1,n2):
if fa[n1]!=fa[n2]:
fa[n1]=find_set(n2)
maxcost=0
sum=0
for i in mlist:
union_set(i[0]-1,i[1]-1)
if i[3]==0:
maxcost=max(maxcost,i[2])
sum+=i[2]
stack=[]
for j in fa:
stack.append(find_set(j))
if len(set(stack))==1:
return sum-maxcost
else:
return -1
def func_5Gjianshe_main():
import sys
while 1:
n=int(sys.stdin.readline().strip())
m=int(sys.stdin.readline().strip())
mlist=[]
for i in range(m):
mlist.append(list(map(lambda x :int(x),sys.stdin.readline().strip().split())))
# print(n,mlist)
print(func_5Gjianshe(n,mlist))
func_5Gjianshe_main()