Kruskal算法
Input 图G(V,E) ,权值函数W
Output 最小生成树所包含的边
- 初始化返回边集A为空
- 将输入的边权值按照递增顺序排序
- 将每个顶点建立起一个集合
- for (u,v)属于E
- if u,v不在同一个集合中 //说明该边不在同一个连通图中
-
将边(u,v)添加到返回集合A中
-
合并set(u),set(v) //合并集合u,v
- return A
时间复杂度:O(nlogn)
排序需要O(nlogn),其余各步骤时间复杂度均为O(n)
贪心选择性:最小生成树必然包含图G中权值最小的边(u,v)
设T为图G的一棵最小生成树,若其不包含边(u,v),则将该边添加到T中导致成环,选择环中的另一条边(x,y),将其删除得到另一棵生成树T1,易得w(T1) = w(T) - w(x,y) + w(u,v) < w(T).所以与T为最小生成树矛盾,因此最小生成树必然包含图G中权值最小的边(u,v)
优化子结构:原问题的优化解由子问题的优化解构成
假设T/(u,v) 不是G/(u,v)的最小生成树,则一定存在一个T1是G/(u,v)的最小生成树,因此T2 = T1 + (u,v) 为G的最小生成树,w(T2) = w(T1) + w(u,v) < w(T/(u,v)) + w(u,v) = w(T) 由此,T2为G的最小生成树,与题设矛盾