图的最小生成树
Posted cuglkb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的最小生成树相关的知识,希望对你有一定的参考价值。
一个有 n 个顶点的连通图法生成树是原图的极小连通子图,它包含原图中所有的 n 个顶点,并且具有保持图连通的最小的边。
根据生成树的定义,具有 n 个顶点的无向连通图不管它的生成树是怎么样的,它有且仅有 n-1 条边。
如果一个无向连通图是一个带权图,那么在它所有的生成树中必定有一棵树的边的权值最小,这样的树我们成为最小代价生成树,简称为最小生成树。
生活中很多求最小生成树的问题,比如在多个城市之间铺设光缆如何使得费用最小的问题。
由上面的定义我们知道最小生成树必须满足以下几个条件
1、n 个顶点
2、n-1 条边
3、不存在回路
4、权值之和最小
构造最小生成树的方法很多,最经典的构造算法是Prim算法和Kruskal算法。
1、Prim算法
设G=(V,E) 为一个带权图,设置两个新的集合 U 和 T 。
其中 U 用于存放带权图G的最小生成树的顶点集合,T 用于存放带权图G的最小生成树的权值的集合。
Prim算法的思想为: 首先令集合U 的初值为 U = {u0},即初始顶点为 u0 。集合 T = {} 。
从集合 U 中包含的顶点中选取 权值最小 并且 顶点不在 U 中 的邻接顶点,将它加入U中,对应的边加入T 中。
一直重复上述操作,直到 U 集合中包含所有的顶点,此时 U 中存放的就是最小生成树的顶点的集合,T中存放的就是最小生成树的边的集合。
具体代码请查看我的github
2、Kruskal算法
Kruskal算法是一种按照带权图中边的权值的递增顺序构造最小生成树的方法。
它 的思想是,假设带权图G的最小生成树 T={V,{}},即初始状态T包含所有的顶点,但不包含任何一条边,
然后按照权值的递增顺序考察边,如果边的两个顶点属于T的两个不同的连通分量,则将边加入T,如果属于同一连通分量则舍去该边。
当T中的连通分量个数为1时,此时T就表示最小生成树。
以上是关于图的最小生成树的主要内容,如果未能解决你的问题,请参考以下文章