最小生成树
最小生成树的定义
给定一个图 G=(V,E) , 并且对于每条边 (u,v)∈E 的权重使用 ω(u,v) 来表示。我们希望找到一个无环子集 T⊆E , 既能够将所有的节点连接起来,又具有最小的权重,即 ω(T)=∑(u,v)∈Tω(u,v) 的值最小。由于T是无环的,并且连通所有的节点。因此, T 必然是一颗树。我们称这样的树为生成树,我们称求取该生成树的问题为最小生成树问题。
简单的描述为:
解决最小生成树问题的两种算法为: Kruskal 算法 和 Prime 算法。
假定有一个连通的图
这个贪心策略可以有下面通用的方法来表述。该通用的方法在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中。管理一个遵守下述循环不变式的边的集合
在每遍循环之前,A是某棵最小生成树的一个子集
在每一步,我们要做的事情是选择一条边
(u,v)
, 将其加入到集合
A
中,使得
Kruskal 算法
在Kruaskal 算法中,集合
给定下面这个图,Kruaskal算法生成最小树的过程为:
step1: 在图中选择权值最小的边
step2: 在剩下未选着的边中继续选着权值最小的边
重复step2知道所有的顶点就相连接。
其伪代码为:
由于Kruskal算法是以边作为出发点的,因此该算法适合稀疏图。
Prime 算法
Prime 算法的工作原理与Dijkstra的最短路径算法相似。Prime算法所具有的一个性质是集合
A
中的边总是构成一棵树。这棵树从一个任意的根节点
其Prime算法的计算过程为:
step1:假设我们选择顶点
v1
作为出发点。则选择与
v1
直接相连接权值最小的边
(v1,v4)
。则有
A={v1,v4}
。
step2: 在图未选着的边中选择与集合
A
中的顶点直接相连接具有权值最小的边,并且把顶点加入到集合
step3: 重复step2知道所有的顶点都加入到了集合
其伪代码为:
Reference:
(1). 《算法导论》第三版 Thomas H.Cormen et al.
(2). 数据结构–陈越、何钦铭