生成树
对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树。
上图所示,左边是一张连通图,右边是其对应的 2 种生成树。
连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往一张连通图可能有多种不同的生成树与之对应。
连通图中的生成树必须满足以下 2 个条件:
包含连通图中所有的顶点;
任意两顶点之间有且仅有一条通路;
因此,连通图的生成树具有这样的特征,即生成树中边的数量 = 顶点数 - 1。
最小生成树
加权图的最小生成树是一棵生成树,其所有边的权值之和不会大于其它任何生成树。
最小边原则:图中权值最小的边(如果唯一的话)一定在最小生成树上。
唯一性:一棵生成树上,如果各边的权都不相同,则最小生成树是唯一的。反之不然。
生成森林
生成树是对应连通图来说,而生成森林是对应非连通图来说的。
我们知道,非连通图可分解为多个连通分量,而每个连通分量又各自对应多个生成树(至少是 1 棵),因此与整个非连通图相对应的,是由多棵生成树组成的生成森林。
上图所示,是一张非连通图,可分解为 3 个连通分量,其中各个连通分量对应的生成树如下图所示:
注意,上图中列出的仅是各个连通分量的其中一种生成树。
因此,多个连通分量对应的多棵生成树就构成了整个非连通图的生成森林。
最小生成树解法
最小生成树可以用一下两种算法求解:
- 无向图的最小生成树(贪心思想)
Prim算法,适用于点少的图
Kruskal算法,适用于边少的图 - 有向图的最小树形图
生成树和最小生成树有许多重要的应用。
例如:要在n个城市之间铺设光缆,主要目标是要使这n个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。
Prim算法构建最小生成树的过程
例:
Kruskal算法构建最小生成树的过程
例:
Kruskal算法简单描述
1).记Graph中有v个顶点,e个边
2).新建图Graph_new,Graph_new中拥有原图中相同的e个顶点,但没有边
3).将原图Graph中所有e个边按权值从小到大排序
4).循环:从权值最小的边开始遍历每条边 直至图Graph中所有的节点都在同一个连通分量中
if 这条边连接的两个节点于图Graphnew中不在同一个连通分量中,添加这条边到图Graphnew中
示例图演示:
参考:
水火379:https://www.cnblogs.com/zhangming-blog/p/5414514.html