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

最小生成树

时间:2015-05-25 16:41:09      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然会考虑一个问题,就是如何在最节省经费的前提下建立这个通信网。类似此类的问题很多,比如煤气管道问题等,这些问题都等价于,在含有n个顶点的连通网中,选择n-1条边,构成一颗极小的连通子图,并使该连通子图中n-1条边上的权值达到最小,则称该子图为连通网的最小生成树

        有两种常用算法,分别是克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法。

        先介绍Kruskal算法,该算法的思想为:为使生成树上总的权值之和达到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出 n-1 条互不构成回路的权值最小边为止。具体作法如下:首先构造一个只含 n 个顶点的森林,然后依权值从小到大从连通网中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通网的最小生成树。

        示例如下:

技术分享

技术分享

该算法的时间复杂度为O(elge);Kruskal算法的时间主要取决于边数,它较适合于稀疏图。

        接下来介绍普里姆算法,该算法思想为:首先选取图中任意一个顶点 v 作为生成树的根,之后继续往生成树中添加顶点w,则在顶点 w 和顶点 v 之间必须有边,且该边上的权值应在所有和 v 相邻接的边中属最小。示例如下:

技术分享

该算法的时间复杂度为O(n2)。与图中边数无关,该算法适合于稠密图。


最小生成树

标签:

原文地址:http://blog.csdn.net/mevicky/article/details/45970021

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