题目来自于:http://acm.hdu.edu.cn/showproblem.php?pid=1232
这道题考察的是并查集的内容
题目描述:
省*“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入描述:
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。 输出描述:对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
示例1
输入
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
输出
3
?
思路描述:
首先得保证道路之间是畅通的,这就牵扯到了并查集,
首先可先将成本进行排序,优先搭建成本低的线路;只要满足这个并查集内包含了全部的道路,即可完成设计
def findRoot(village):
global villages
if villages[village] == -1:
return village
else:
temp = findRoot(villages[village])
villages[village] = temp
return temp
while True:
try:
n,m = list(map(int,input().split()))
if n == 0:
break
roads = []
for i in range(n):
roads.append(list(map(int,input().split())))
values = 0
villages = [-1 for i in range(m+1)] # 从1开始代表每个城市的掌门
roads.sort(key=lambda x:x[2]) #按照成本进行排序
nodeNum = 1 # 并查集从第一条路建起
for i in range(n):
a = findRoot(roads[i][0])
b = findRoot(roads[i][1])#按城市寻找掌门
if a != b: #建立两个集合的联系
villages[a] = b
values += roads[i][2]
nodeNum += 1
if nodeNum == m:
break
if nodeNum == m:
print(values)
else:
print('?')
except Exception:
break