算法与数据结构学习——最小生成树
引入
在之前的学习中,我们已经介绍了图的储存方式等相关内容。
(这里待补坑)
数据结构课本上引入:
“假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然会考虑 这样一个问题,如何在最节省经费的前提下建立这个通信网”
在含有n个结点的连通网中挑选n-1条边构造一颗边权和最小(耗费最小),这个问题就是最小代价生成树( Minimum Cost Spanning Tree)(简称最小生成树)构造问题。
定义补充
关于图的几个概念定义:
连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。
强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。
连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
算法
构造最小生成树有很多算法,但是他们都是利用了最小生成树的同一种性质:
MST性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边, 其中u属于U,v属于V-U,则必定存在一颗包含边(u,v)的最小生成树
性质证明:
反证法:假设网N的任何一棵最小生成树都不包含(u,v)。设T是连通网上的一棵最小生成树, 当将边(u,v)加入到T中时,由生成树的定义,T中必存在一条包含(u,v)的回路。另一方面,由于T是生成树, 则在T上必存在另一条边(u’,v’),其中u’∈U,v’∈V - U,且u和u’之间,v和v’之间均有路径相通。 删去边(u’,v’),便可消除上述回路,同时得到另一棵生成树T’。因为(u,v)的代价不高于(u’,v’), 则T’的代价亦不高于T,T’是包含(u,v)的一棵最小生成树,和假设矛盾。
下面就介绍两种使用MST性质生成最小生成树的算法:普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法。
2、普里姆算法—Prim算法
首先就是从图中的一个起点a开始,把a加入U集合,然后,寻找从与a有关联的边中, 权重最小的那条边并且该边的终点b在顶点集合:(V-U)中,我们也把b加入到集合U中, 并且输出边(a,b)的信息,这样我们的集合U就有:{a,b},然后,我们寻找与a关联和b关联的边中, 权重最小的那条边并且该边的终点在集合:(V-U)中,我们把c加入到集合U中,并且输出对应的那条边的信息, 这样我们的集合U就有:{a,b,c}这三个元素了,一次类推,直到所有顶点都加入到了集合U。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!