1. 什么是生成树
生成树的定义:
一个连通图的生成树是指一个极小连通子图,它含有图中全部顶点(n),但是它只有构成一棵树的(n - 1)条边。
相信有些同学对这个定义很懵逼,不要急,下面我们就针对生成树的定义进行解释:
图1-什么是生成树
对于连通图和极小连通子图的基本概念的话,在前面的学习中我们已经介绍过了,这里就不再赘述了。我们直接进入正题。
对于左边的连通图来说,当去掉顶点(2,3)和(3,4)之间的边后,就是一棵生成树。现在我们提出两个问题:
为什么这样就是一棵生成树了?它是否满足生成树的定义呢?
带着这些问题,再根据之前我们所说的生成树的定义进行思考,并分析:
1 . 首先它是一个极小连通子图
2 . 且它包括连通图中全部顶点(有5个顶点)
3 . 它只有构成一棵树的(5 - 1)条边
当你分析完的时候你会发现,这棵树的确满足生成树的定义,所以它是一棵生成树。我们对这棵生成树再调整一下,把顶点1作为树的根节点,其实本质上顶点之间的关系并没有改变,但是看起来更像一棵树。
2. 生成树的特点
图2-生成树的特点1
如图2所示,如果我们在这样的一棵生成树上添加一条边,那么顶点0,顶点1,顶点2之间必定会构成一个环(回路),但是在生成树中是不允许出现回路的。
图3-生成树的特点2
如图3所示,如果在这样的一棵生成树再少一条边的话,比如去掉顶点(1,0)之间的一条边后,变成了2个连通分量,那么就不再是连通的了,也就不满足生成树的定义了。
图4-生成树的特点3
另外,有(n - 1)条边的图不一定都是生成树,比如上图中的虽然有(n - 1)条边,但是有两个连通分量,不满足生成树的定义。
3. 连通图和生成树
图5-深度优先生成树
在图5中,是由深度优先(DFS)遍历得到的生成树,也称为深度优先生成树,如果图G是采用邻接表存储的话,那么就是通过遍历邻接表产生的生成树,而实际上它就是DFS遍历得到的图序列:0 - 2 - 3 - 4 - 1 - 5。
图6-广度优先生成树
在图6中,是由广度优先(BFS)遍历得到的生成树,也称为广度优先生成树,BFS也是通过遍历邻接表产生的生成树,只不过遍历的方式有所不同,得到的生成树也不同。
总结: 由此可知,一个连通图的生成树不一定是唯一的。
到这里,如果有同学对生成树的过程不太明白的话,赶快把BFS和DFS遍历的原理补一补。
4. 非连通图和生成森林
图7-非连通图的生成森林
对于一个无向非连通图G来说,它有2个连通分量,需要对每一个连通分量进行遍历,且每个连通分量在遍历过程中都会生成一个树,如连通分量1遍历后产生了生成树1,连通分量2遍历产生了生成树2,而所有的连通分量在遍历过程中产生的生成树就组成了非连通图的生成森林。
当然,我们重点关注的还是带权连通图的最小生成树。
5. 带权连通图的最小生成树
前面我们学习带权图的时候说过,图的每条边都会有一个权值。
图8-带权连通图的最小生成树
对于一个带权连通无向图G来说,可以有多棵不同的生成树,每棵生成树的所有边上的权值之和也可能不同(第三小节中的总结)。
生成树1的权值之和为:8 + 3 + 4 + 4 = 19
生成树2的权值之和为:2 + 1 + 4 + 4 = 11
那么显然生成树2的距离要比生成树1的距离要小很多。有同学可能会问,这能解决什么问题?
假设你是电信的网络工程师,现在要你给图8中的0 - 4这5个地方铺设网线,每个地方之间的连线表示距离(权值),但是要求你以最小的成本来完成,而这个所谓最小成本是指:把这5个地方的距离加起来,使得总的距离最小, 这就是最小成本。于是你设计了2个方案,方案1的距离为19,而方案2的距离为11,通过对比两种方案发现:方案2所需的成本为最小。
通过这个例子,我们可以知道,图的所有生成树中权值之和最小的树称为图的最小生成树。而在现实生活中,其实还有很多这样类似的问题都可以通过带权图的最小生成树来解决。
构造最小生成树的三条准则(重要):
(1)必须只使用该图中的边来构造最小生成树
(2)必须使用且仅使用n-1条边来连接图中的n个顶点
(3)不能使用产生回路的边