kruskal(克鲁斯卡尔)的思路很直观,边按权值从小到大排序,然后从小到大选不会构成回路的边,构成生成树。(选两点不在同一个连通分量里面的边)
构建并查集,用并查集判断是否构成回路(是否在同一个分量里面)(两个连通分量如果根结点相同,两点连接就会构成回路)
python代码:
def find(x, pres):
"""
查找x的最上级(首级)
:param x: 要查找的数
:param pres: 每个元素的首级
:return: 根结点(元素的首领结点)
"""
root, p = x, x # root:根节点, p:指针
# 找根节点
while root != pres[root]:
root = pres[root]
# 路径压缩,把每个经过的结点的上一级设为root(直接设为首级)
while p != pres[p]:
p, pres[p] = pres[p], root
return root
def join(x, y, pres, ranks):
"""
合并两个元素(合并两个集合)
:param x: 第一个元素
:param y: 第二个元素
:param pres: 每个元素的上一级
:param ranks: 每个元素作为根节点时的秩(树的深度)
:return: None
"""
h1, h2 = find(x, pre