最小生成树

来源:互联网 发布:外网端口映射软件 编辑:程序博客网 时间:2024/06/07 00:34

最小生成树

最小生成树的定义

给定一个图G=VE, 并且对于每条边(u,v)E的权重使用 ω(u,v) 来表示。我们希望找到一个无环子集TE, 既能够将所有的节点连接起来,又具有最小的权重,即 ω(T)=(u,v)Tω(u,v)的值最小。由于T是无环的,并且连通所有的节点。因此,T必然是一颗树。我们称这样的树为生成树,我们称求取该生成树的问题为最小生成树问题

简单的描述为:
最小生成树

解决最小生成树问题的两种算法为: Kruskal 算法Prime 算法
假定有一个连通的图G=(V,E)和权重函数ω:ER, 我们希望找出图G的一颗最小生成树。对于Kruskal算法和Prime算法都是使用贪心算来解决这个问题的,但是他们使用的贪心策略的方式却是有所不同。
这个贪心策略可以有下面通用的方法来表述。该通用的方法在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中。管理一个遵守下述循环不变式的边的集合A :

在每遍循环之前,A是某棵最小生成树的一个子集

在每一步,我们要做的事情是选择一条边(u,v), 将其加入到集合A中,使得A不违反循环不变式,及A{(u,v)}。由于我们可以安全的将这种边加入到结合A而不破坏A的循环不变式,因此称这样的边的集合A安全边

Kruskal 算法

在Kruaskal 算法中,集合A是一个深林,其节点就是给定图的节点。每次加入到集合A中的安全边永远都是权重最小的连接两个不同分量的边。
给定下面这个图,Kruaskal算法生成最小树的过程为:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述
step1: 在图中选择权值最小的边(v1,v4)(v6,v7), 加入到集合A中。
step2: 在剩下未选着的边中继续选着权值最小的边(v3,v4)(v1,v2)。所选择的边不能破坏A的循环不变式,及在A中的边不能师的所选着的顶点构成回路。
重复step2知道所有的顶点就相连接。
其伪代码为:
Kruskal
由于Kruskal算法是以边作为出发点的,因此该算法适合稀疏图。

Prime 算法

Prime 算法的工作原理与Dijkstra的最短路径算法相似。Prime算法所具有的一个性质是集合A中的边总是构成一棵树。这棵树从一个任意的根节点r开始,一直长大到覆盖V中所有节点时为止。算法每一步在连接AA之外的顶点的所有边中,选择一条权重最小但是又不破坏构成最小生成树的规则(及选的边不能使得A中的顶点构成回路)。因此,当算法终止是,A中的边形成一颗最小生成树。
其Prime算法的计算过程为:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述
step1:假设我们选择顶点v1作为出发点。则选择与v1直接相连接权值最小的边(v1,v4)。则有A={v1,v4}
step2: 在图未选着的边中选择与集合A中的顶点直接相连接具有权值最小的边,并且把顶点加入到集合A中。其中所选择的边不能使得集合A中的顶点构成回路。
step3: 重复step2知道所有的顶点都加入到了集合A中。
其伪代码为:
Prime

Reference:
(1). 《算法导论》第三版 Thomas H.Cormen et al.
(2). 数据结构–陈越、何钦铭

0 0
原创粉丝点击