码迷,mamicode.com
首页 > 其他好文 > 详细

图的最小生成树

时间:2018-11-14 12:24:52      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:github   初始   不包含   表示   包含   集合   设置   它的   个数   

一个有 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就表示最小生成树。

技术分享图片

 

图的最小生成树

标签:github   初始   不包含   表示   包含   集合   设置   它的   个数   

原文地址:https://www.cnblogs.com/cuglkb/p/9956981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!