测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。
对每个测试用例,在1行里输出最小的公路总长度。
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
3 5
while True:
try:
n=int(input().strip())
def isroot(i,tree):
if tree[i]==-1:
return i
else:
temp=isroot(tree[i],tree)
tree[i]=temp
return temp
if n!=0:
tree=[-1]*n
road=[]
result=0
#print(istoot(2))
for i in range(n*(n-1)//2):
road.append(list(map(int,input().strip().split(' '))))
#print(road)
road=sorted(road,key=lambda x:x[2])
for i in range(n*(n-1)//2):
one=isroot(road[i][0]-1,tree)
two=isroot(road[i][1]-1,tree)
if one!=two:
result+=road[i][2]
tree[one]=two
print(result)
except:
break
#最小生成树Python写法,Kruskal算法
#(把所有点集放在一颗树上就相当于全部点连通;从最小权值构建树开始)
def findRoot(x): #找树根,如果起始树根为自己
global tree
if (tree[x] == -1):
return x
else:
temp = findRoot(tree[x])
tree[x] = temp
return temp
try:
while True:
num = int(input())
if num == 0:
break
roadsList = []
for i in range(num * (num - 1) // 2):
roadsList.append(list(map(int, input().split())))
roadsList.sort(key=lambda x: x[2]) #Python中list排序可以指定第几号元素排
tree = [-1 for i in range(num + 1)] #初始化树,起始树根都为自己
result = 0
for i in range(num * (num - 1) // 2): #循环每条路
a = findRoot(roadsList[i][0]) #查找路的两端的树根
b = findRoot(roadsList[i][1])
if a!=b: #如果树根相等说明在同一颗树上
result += roadsList[i][2] #因为从最小权值开始,所以得到的是最小生成树
tree[a] = b
print(result)
except Exception:
pass