用到并查集判断连通性,效率很高,最终时间复杂度为O(nlogn)
思路:
1,先将边的权值从低到高排序
2,如果两个顶点已经连接便跳过,如果未连接就将其连接
3,当边数为顶点数-1时,最小生成树完成
class UnionFind(object): def __init__(self,n): self.uf=[i for i in range(n+1)] self.rank=[0 for i in range(n+1)] #树高度 self.sets_count=n #集合个数 def find_root(self,p): if self.uf[p]==p: return p else: self.uf[p]=self.find_root(self.uf[p]) return self.uf[p] def unite(self,a,b): a=self.find_root(a) b=self.find_root(b) if a==b: return if self.rank[a]<self.rank[b]: #树低的一方合并到树高的一方 self.uf[a]=b else: self.uf[b]=a #规定默认情况右边合并到左边 if self.rank[a]==self.rank[b]: self.rank[a]+=1 def is_connect(self,a,b): return self.find_root(a)==self.find_root(b) data='''2 4 11 3 5 13 4 6 3 5 6 4 2 3 6 4 5 7 1 2 1 3 4 9 1 3 2''' lines=data.split(" ") for i,line in enumerate(lines): lines[i]=list(map(int,line.split(" "))) lines.sort(key=lambda line:line[2]) u=UnionFind(6) #边数 count=0 mins=0 for minx in lines: if u.is_connect(minx[0],minx[1]): continue else: u.unite(minx[0],minx[1]) count+=1 mins+=minx[2] if count>=5: break print(mins)