最小生成树论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小生成树论文
摘要:最小生成树是图论的经典问题,求最小生成树以及求最小生成树的权值和得到了足够关注,而很少人去研究最小生成树是否唯一。对于给定的图而言,因为最小生成树的权值和是确定的,所以最小生成树不唯一当且仅当最小生成树的形状不唯一。本文提出判断最小生成树是否唯一的三种方法并且对它们给予分析和评价。
关键词:最小生成树;唯一;prim算法;kruskal算法;次小生成树
minimum spanning tree if the unique
wu yuliang,kong fanlong
(central china normal
university,wuhan430079,china)
abstract:minimum spanning tree is a classic problem of graph theory,find the minimum spanning tree minimum spanning tree,and find the weight and get enough attention,and few people to study the minimum spanning tree is unique.for a given graph is concerned,because the weights and the minimum spanning tree is determined,so the minimum spanning tree is not unique and only if the shape of the minimum spanning
tree is not unique.determine whether the proposed minimum spanning tree,and the only three ways to give their analysis and evaluation.
keywords:minimum spanning tree;unique;prim algorithm;kruskal algorithm;small spanning tree
一、三种方法判断最小生成树(mst)是否唯一
(一)借助prim算法提出的方法
prim算法的基本思想是:首先选取图中的任意一个顶点v作为树的根加入生成树的集合q中,之后不断往生成树中(集合q中)添加顶点w,顶点w满足与集合q中的某个顶点之间有边,且该边上的权值是此时所有连接集合q中的结点与不在集合q中的结点的边中权值最小的,如此加入n-1个结点后,就形成了mst。
按照上面的思想,可以知道最小生成树加入点的顺序。最小生成树是由点和边组成的,点在上边已经确定,我们还需确定边才能最终确定最小生成树。每次加入顶点w时(第一点除外),顶点w都满足与集合q中的某个顶点有当时最小权的边,把集合q中的那个顶点看作顶点w的前驱结点。那么到算法结束时,我们都能得到每个点(第一个点除外)的前驱结点,将每个点(第一个点除外)与它的前驱结点相连,就有n-1条边了,最小生成树构造完成。
该算法的伪代码描述:
primmst(g,r)//求图g的以r为根的mst,通过求每个点的前驱结点来求mst
{//初始化,q←{r},除r外的所有前驱结点都为r且与q的最短距离都是与r的距离。
initcandidateset(…);
for(k=0;k }
union(e[k].u,e[k].v);//将两端点所在集合合并为一个集合
e[num++]=k;//记录k为mst中的边
}
}
输出mst唯一;//若没发现mst不唯一的情况,则mst 唯一。
}
(三)借助次小生成树提出的方法
次小生成树是所有生成树中权值和第二小的生成树。判断最小生成树是否唯一可以转化到判断次小生成树的权值和是否与最小生成树的权值和相等的问题上来。如果权值和相等,那么最小生成树不唯一,否则唯一。
求次小生成树的基本思想是:先求最小生成树,然后枚
举最小生成树的每一条边(总共有n-1条),删去后再求最小生成树,这样得到的所有生成树中最小的就是次小生成树。
该算法的伪代码描述为:
sst(g)
{
sum1=kruskalmst(g);//最小生成树的权值和
for(sum2=maxint,i=0;i { j=kruskalmst(g-e[i]);//去掉mst中的第i条边后再求最小生成树 if(j } if(sum1==sum2) mst不唯一 else mst唯一 } 二、分析评价三种方法 首先从时空复杂度分析这三种方法:第一种方法只是用prim算法求了两次mst,所以跟prim算法的时空复杂度是一样的,都是o(n^2)。在第二种方法中,kruskal的时间复杂度的瓶颈在于对边排序,后面对边扫描是o(e),而判断 mst是否唯一时,排序是一样的,只是扫描时,每次加入一条边时都要向后判断是否存在一条与其权值相等且连接相同两集合的边,所以时间复杂度与边的权值相等的程度相关,最好的时候为o(elog2e),最坏的时候为o(e^2),空间复杂度与kruskal算法一样o(e)。第三种方法用了n次kruskal算法求mst,所以时间复杂度为o(nelog2e),空间复杂度仍是o(e)。然后从思考的难易比较,如果知道次小生成树的话,不得不说第三种方法是最好想的,而第一种(第二种)方法就需要对prim算法(kruskal算法)有深入的理解才能琢磨出。最后总整体来评价这三种算法,第三种算法是比较容易想的,当想不到前面两种方法时,牺牲时间总比没有方法好;而第二种方法在图是稀疏图且相同边权的边不是很多的情况下,时空复杂度是相当可观的;而第一种方法在稠密图且相同边权很多的情况下,优势非常明显。 三、结束语 本文针对最小生成树是否唯一提出了三种解决方法,并且从多种角度分析它们的利弊以及说明它们的适用范围。 参考文献: [1]r.l.graham & p.hell.minimum spanning tree.annals of the history of computing,volume 7,number 1,january 1985.43-57