最小生成树

来源:互联网 发布:小班防火知多少课件 编辑:程序博客网 时间:2024/05/29 16:35

先说下最小生成树的定义:给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小(在所有连通图中权值之和最小),则称有这n个顶点和n-1条边构成了图的最小生成树
最小生成树有3个性质:
(1)最小生成树是树,因此其边数等于定点数减1,且树内一定不会有环;
(2)对给定的图G(V,E),其最小生成树可以不唯一,但是其边权之和一定是唯一的;
(3)由于最小生成树是无向图上生成的,因此其根结点可以是这棵树上的任意一个结点。
常用的有:
**Prim算法
Kruskal算法**
Prim算法是解决最小生成树的常用算法之一。
主要思想:它采取贪心策略。指定的顶点开始寻找最小权值的邻接点。
图G=【V,E】,初始时S={V0},把与V0相邻接,且边的权值最小的顶点加入到S。不断地把S中的顶点与V-S中顶点的最小权值边加入,直到所有顶点都已加入到S中。
通俗的讲,就是从已构建的生成树中选取一个点,从散点中选取一个点,满足这两个点连成的边在这两个集合中的点连成的边中最小,将该散点加入生成树中,重复这一过程,直到所有点都连接到最小生成树上。

Kruskal算法是基于贪心的思想得到的。首先我们把所有的边按照权值先从小到大排列,接着按照顺序选取每条边,如果这条边的两个端点不属于同一集合,那么就将它们合并,直到所有的点都属于同一个集合为止。至于怎么合并到一个集合,那么这里我们就可以用到一个工具——-并查集
换而言之,Kruskal算法就是基于并查集的贪心算法。

至于具体的应用,等以后遇到再双手奉上。
ps:代码的话网上一堆,这里就不赘述了。