加权图是一种为每条边关联一个权值或是成本的图模型,这种图能够自然地表示许多应用。在一幅航空图中,边表示航线,权值则表示距离或是费用。在这个情形中,最令人感兴趣的是将成本最小化。我们可以通过学习加权无向图模型并用算法回答下面这个问题。
最小生成树,给定一幅加权无向图,找到它的一棵最小生成树。
定义:图的生成树是它的一棵含有其所有顶点的无环连通子图,一幅加权无向图的最小生成树(MST)是它的一棵权值最小的生成树。
计算最小生成树的两种经典算法:Prim算法和Kruskal 算法。
一些约定:
- 只考虑连通图。我们对生成树的定义只可能存在于连通图中;
- 边的去那种不一定表示距离;
- 边的权重可能是0或者负数;
- 所有边的权重都各不相同;
4.3.1 原理
树的两个重要性质:
- 用一条边链接树中的任意两个顶点都会产生一个新的环
- 从树中删去一条边将会得到两个独立的数。
这两个性质是证明最小生成树的另一条基本性质的基础,而这条基本性质就能够得到本节中的最小生成树。
4.3.1.1 切分定理
切分定理将会把加权图中的所有顶点分为两个集合、检查横跨两个集合的所有边并识别哪条边应属于图的最小生成树。
我们通过制定一个顶点集并隐式地认为它的补集为另一个顶点集来指定一个切分。
切分定理
在一幅加权图中,给定任意的切分,它的横切边中的权重最小者必然属于图的最小生成树。
证明:另e为权重最小的横切边,T为图的最小生成树。我们采用反正法:假设T不包含e。那么将e加入T,得到的图必然含有一条经过e的环。且这个环至少含有另一条横切边--- 设为f,f的权重必然大于e(因为e的权重是最小的且所有的权重均不同)。那么我们删掉f而保留e就可以得到一棵权重更小的生成树。这和我们假设T矛盾。
切分定理表明权重最小的横切边必然属于最小生成树。
4.3.1.2 贪心算法
切分定理是解决最小生成树问题的所有算法的基础。这些算法是一种贪心算法的特殊情况:使用切分定理找到最小生成树的一条边,不断重复直到找到最小生成树的所有边。这些算法相互之间的不同之处在于保存切分和判定权重最小的横切边的方式,
贪心算法就是识别一条权重最小的横切边并将它加入最小生成树中。
4.3.2 加权无向图的数据类型
加权无向图的表示就是通过对无向图的扩展:在邻接矩阵的表示中,可以用边的权重代替布尔值来作为矩阵的元素;在邻接表的表示中,可以在链表的结点中增加一个权重域。
4.3.2.1 用权重来比较边
4.3.3 最小生成树的API和测试用例
在API中会定义一个接受加权无向图为参数的构造函数并且支持能够为用例返回图的最小生成树和其权重的方法。
4.3.4 Prim算法
prim算法就是在每一步都会为一棵生长中的树添加一条边。一开始是一个顶点,然后每次总是将下一条连接树中的结点与不在树中的顶点且权重最小的边加入树中。
命题L Prim算法能够得到任意加权无向图的最小生成树
证明:由命题K可知,这棵不断生长的树定义了一个切分且不存在黑色的横切边,该算法会选取权重最小的横切边并根据贪心算法不断将他它们标记为黑色。
4.3.4.2 维护横切边的集合
要维护一个包含所有横切边的集合,就要将连接这个顶点和其他所有不在树中的顶点的边加入优先队列中,但还有一点就是:连接新加入树中的顶点与其他已经在树中顶点的所有边都失效了。Prim算法的即时实现可以将这样的边从优先队列中删掉。但也可以延时删除。
4.3.4.4 运行时间
命题: