classUnionFind:def__init__(self, n):
self.parent =list(range(n))
self.cnt = n
deffind(self, a):
acopy = a
while a != self.parent[a]:
a = self.parent[a]while acopy != a:
self.parent[acopy], acopy = a, self.parent[acopy]return a
defmerge(self, a, b):if self.find(a)!= self.find(b):
self.parent[self.find(b)]= self.find(a)
self.cnt -=1returnTruereturnFalse# 不能加入此边classSolution:defminimumCost(self, n:int, connections: List[List[int]])->int:# 建图
g = defaultdict(list)for x, y, c in connections:
g[x].append(y)
g[y].append(x)# 联通分量check
cnt =0
visit = defaultdict(bool)defdfs(cur):nonlocal cnt, visit
if visit[cur]isTrue:return
visit[cur]=True
cnt +=1for next_node in g[cur]:
dfs(next_node)
dfs(1)if cnt != n:return-1# 最小生成树Kruskal# 取最小的边且不成环(并查集)
uf = UnionFind(n)
min_cost =0
connections.sort(key =lambda x: x[2])for x, y, c in connections:if uf.merge(x -1, y -1):
min_cost += c
if uf.cnt ==1:return min_cost