MST:最小支撑树,有n个节点和n-1条边(边数是保持连通图的最小值,即仅仅够形成树即可)。用途例如“铺设最小代价的网络”。
PFS算法按照优先级生成支撑树:
算法:1、更新所有顶点的优先级
2、从中选出优先级最大的节点(数据结构为优先级队列priority queue)
3、viseted之并和边一起加入支撑树
4、重复1-3步,直至所有点为visited状态
缘起:若用枚举的方法,根据cayley公式,在完全图中有n^(n-2)棵支撑树,所以我们需要高效地求得最小支撑树。
原理:任何一个割的最短桥(也称跨边crossedge)必然属于某一个MST。(prim算法从数学角度看并非是严谨的,因为这些最短桥未必属于同一棵MST,而且MST的结果也不唯一,但prim将这些最短桥拼凑在一起是一种正确解,该算法可行。)每一条最短桥,都是当下两个集合(割)之间的最短距离。
prim算法:(贪心策略):从任意点v开始,将最短边选为tree边,相应节点纳入到最小支撑树中。
Kruskal算法:初始时节点集合包含有n个节点,边集为空。取权值最小的边加入“边集”,只要该边的两个节点尚未有通路即可,若有则放弃该边进行下一条边的尝试。直到边数==n-1时算法停止,即得到MST。