1.Kruskal算法
算法描述:
(1)将点孤立,边非递增排序。(2)依次添加边e:如果添加e后没有构成回路,则e属于最小生成树(MST, Minimum Spanning Tree);否则,舍弃。
(3)直至添加n-1条边(n为顶点个数)。
判断添加的边(u,v)是否构成回路,可用并查集(union-find sets)来实现:判断u, v的root节点是否一样,即判断root(u)==root(v)。若相等,说明添加(u,v)后构成回路;反之,则不会。
对并查集优化:root节点的parent域为负值,其绝对值为该树的结点数;并查集的union操作采用加权规则,即两个子树union,节点数多的子树的root为新树的root。