Cousera 《Algorithms II》课程作业
Minimum Spanning Tree (MST) 生成树为包含图所有顶点的无环连通子图,树中所有边的权值之和最小的生成树即为最小生成树(MST)。
MST Assignment
1、三个问题
Q1. Bottleneck minimum spanning tree - 最小瓶颈生成树
一个生成树的瓶颈容量为最大边的权重。最小瓶颈生成树 即为瓶颈容量最小的生成树。设计一个寻找最小瓶颈生成树的算法。
A: MST 一定是最小瓶颈生成树,即最小生成树是最小瓶颈生成树的充分不必要条件,因此用 prim 算法或 kruskal 算法即可获得。Coding 可见 algs4 中的 PrimMST.java & KruskalMST.java
Q2. Is an edge in a MST? - 一条边是否在 MST 内?
判断一条边是否是 MST 中的边。设计一个线性复杂度的算法。
A: 线性复杂度则不能通过寻找 MST 的方法。可以通过参考资料中的算法,边 e 两端的顶点分别为 u,v。删除边 e,寻找是否有由权重小于等于 e 的边组成的路径使得 uv 连通。具体代码如下,这里用到了 algs4 中的 Edge 类和 EdgeWeightedGraph 类等。
1 | public class IsEInMST { |
参考资料:
Q3. Minimum-weight feedback edge set - 最小权重反馈边集
反馈边集合是指包含无向图中每一个环的至少一条边的集合。如果从图中移除反馈边集,得到的图无环。设计一个算法找到最小权重的反馈边集(假设所有边的权重为正)。
A: 即求解图最大生成树,对最大生成树所在边求补集即为最小权重反馈边集。通过调整最小堆为最大堆,利用 Prim 算法或 Kruskal 算法均可以实现。具体代码如下:
MinFeedbackEdgeSet 类用于调用最大生成树算法和返回集合结果
PrimMaxST 类为求解最大生成树的 Prim 版本,将优先索引队列改为最大堆实现
KruskalMaxST 类为求解最大生成树的 Kruskal 版本,将优先队列改为最大堆实现
MinFeedbackEdgeSet.java
1 |
|
PrimMaxST.java
1 |
|
KruskalMaxST.java
1 |
|
2、总结
- 回顾 IndexMinPQ 的实现方法,用两个数组关联 index 和 key 的位置
- 回顾 Prim 算法,分为两种,lazy 型的只用一个优先队列即可,添加所有的边。时间复杂度 O();egar 型的实时更新,只保留最小边和其权重。
- 回顾 Kruskal 算法,需要利用查并集。
- 学习图论的一些知识
- 奇奇怪怪的知识又增加了