生成树的定义:对于一个图G,获取G的边使得全部的顶点都链接到。最小生成树(MST Minimun spanning tree):给定图G(V,E),以及对应的边的权重,获取一颗总权重最小的生成树。算法
树的定义:链接的无环图数据结构
找到全部的生成树,而后计算权重最小的cors
假如边e={u,v}是某个MST的一条边,经过对合并这两个顶点为一个新的顶点(这种操做称做contract e),将有多条边同时链接多个顶点的合并成一个权重最小的边保留,其它边的链接形式保持不变。能够证实假设T'是G/e(不包含e的G)的MST,那么T'U{e}也是G的MST
函数
假设T*()是G的MST,那么 T*/e(即T') 也是 G/e的MST,即spa
而w(T'Ue)=w(T')+w(e),因此.net
于是成立3d
假设有任意的cut(S,V-S),选取e,使得e是全部crossing cut的最小权重的边,那么e确定是属于某个MST。code
红色的线即 crossing cut的边cdn
假设T是G的一个MST,那么它一定存在一条边e'={u',v'}横跨S和V/S,因为w(e)<=w(e'),能够构造T'=T/{e'}U{e}=w(T)-w(e')+w(e)<=w(T),也就是说T'也是MST,e属于某个MST。blog
维护一个优先级队列Q,它的节点u.key=min{w(u,v)|u in s and v in (S-V)}
初始的图以下
而后获取最小key的节点,显然他就是S
再找到Q中最小的为A,将二者记下来
再查看全部S的邻接表,更新Q的权值,获得
获取最小值为5,将它放入S中
获取最小是为6,获得
最小值为8
更新Q获得
最小值为3
更新Q获得
最小值为9
最小值为15
在整个过程当中,涉及V次的从优先级队列中获取最小值,以及边两倍次的减小key的值,因此总的时间为
使用斐波那契堆能够达到VlgV+E
核心思想:全局最小的corssing cut边一定属于最小生成树,这个过程不能生成环,须要追踪两个节点是否已经互相链接了
追踪的数据结构是 Union-Find 结构,包含3个功能,Make-Set:建立一个集合;Find-Set:找到当前元素在那个集合;Union:合并集合
在使用Union-Find数据结构的基础上可以作到时间为O(ElgE+Eα(V)),假设权重为正整数并且最大值是个常量,那么排序能够达到常量的时间,这个时候,算法所须要的时间就是O(E),总体不Prims算法要好
最快的MST 算法运行指望时间是O(V+E),Karger, Klein, and Tarjan 1993发明