《算法》(第四版)------------图
最小生成树
概念
- 最小生成树:含有图中所有顶点的 无环 连通 子图。
- 切分:将图所有顶点氛围两个非空且不重叠的两个集合。横切边是一条连接两个属于不同集合的顶点的边。
- 切分定理:在一幅加权图中,给定任意的切分,横切边中的权重最小者必然属于该图的最小生成树。
- 最小生成树贪心算法:将最小生成树的边标记为黑色,初试状态边为灰色。找到一种切分,全部横切边均不为黑色,将权重最小的横切边标记为黑色。重复步骤知道标记了V-1条黑色边。
结构
加权无向图:EdgeWeightedGraph
void addEdge(Edge e);
Iterable<Edge> adj(int v);//关联边
边:Edge
double weight();//权重
int either();//顶点之一
int other(int v);//另一个顶点
int compareTo(Edge that);//与另一条边比较
Prim算法
证明
这棵不断生长的树,每次生长都会选择切分中权重最小者的方向选择顶点。即每次从非树顶点中选择一个与数顶点连接最近的最佳顶点作为树的新成员,最终全部顶点都加入到树中则得到最小生成树。
延时实现
思路
private boolean[] marked;//最小生成树顶点
private Queue<Edge> mst;//最小生成树边
private MinPQ<Edge> pq;//横切边(包括失效的边)
//加入起点s到生成树
visit(G,s);//同时将所有与点s连接的非树顶点边加入队列(横切边)
while(!pq.isEmpty())