1、1 贪心方法 2 最小生成树问题 有向图G V E V是顶点集合 E是有向边集合 E O V2 lg E lgV 图的表示1 邻接矩阵表示 G V E V 1 2 n 如果边 i j E A i j 1 否则A i j 0 空间存储 V2 格式是稀疏的 如果图是链表或者树 2 1 3 4 3 2链接表表示方法Adj 1 2 3 Adj 2 3 Adj 3 Adj 4 3 Adj v 度 无向图 出度 有向图 空间占用 V 2E 4 最小生成树 MST Input 无向带权连通图 G V E w E R 假设所有的权值不同 Output 一生成树T 连接所有的顶点 具有最小的权值和W T u v
2、 TW u v 6 12 5 15 9 7 10 8 14 3 5 最优子结构特点 假设上图是一棵最小生成树T 删除一条边e 则成为两课树 T1 T2 而每一棵都是一个最小生产子树 否则 假设T1 是一个比T1更小的生成树 则 T1 e T2 是比T更小的生成树 故最优子结构特点成立 T1 T2 e 6 重叠子结构特点 按最优子结构性质 可把节点集合V分成任意两个子集 v1 V v1 v2 V v2 然后分别求最优生成树 T1 T1 T2 T2 再分别合并成t1 t2 T应该是其中最小的一棵 在求T1最小生成树时 会继续打断 生成T11 T12 T2打断时 会生成T21 T22 但T21 T1
3、1是可能的 故重叠子结构成立 t1 t2 e 7 贪心方法 既有最优子结构 又有重叠子结构 可以用动态规划 但本讲使用更强大的方法 贪心法贪心方法的标志 贪心选择特性 某个局部最优选择 是全局最优的 定理 T是G V E 的最小生成树 令A是V的子集 假如 u v E是连结A和V A的最小边 则 u v T 8 上图是最小生成树 其中红点集合为A 兰点集合为V A 假设 u v 边权值是目前权最小连结A和V A的边却不在生成树中 通过MST 找到一条u到v的路径 找到碰到的第一个连结A和V A的边 打断它 把 u v 加入 还是一个生成树 因为 u v 更短 故新的树权和更小 从而原树为MST矛盾 u v 9 MST的prim算法 思路 令V A为一优先队列Q 每个Q的元素记录优先值的key为到A的最小权值Q V key V key s 0 s任意WhileQ NULLu Extract min Q foreachv Adj u ifv Q w u v Key v thenkey v w u v v u最后 所有的 v v 构成最小生成树的边 10 prim算法时间复杂性 Time V Vtextract Etdeckey Q用不同的结构 时间有所区别textracttdeckeyTime数组 v 1 V2 最小堆 lgv lgv Elgv Fib堆 lgv 1 E Vlgv