连通网的最小生成树

什么是连通网的最小生成树

在一个含有n个顶点的连通图中,一定可以选出n-1条边构成一个极小连通子图。这个子图包含有图中全部的n个顶点,但是只有足以构成一棵树的n-1条边,称这样的子图叫做极小连通子图,而构成的这棵树称为连通图的生成树。由于原来的图中每条边/弧上有对应的权值,所以生成的这棵树中权值和随着 n-1条边选取的不同而不同。权值和取得最小时得到的生成树就是最小生成树。有一个网得到其对应的最小生成树的算法有两种,克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法。

克鲁斯卡尔(Kruskal)算法

为了使极大连通子图中的权值和最小,应该从原来的图中按照弧/边的权值,从小到大进行选择,逐一加入到连通子图中去。为了使其能构成一棵树,要确保所选的弧/边不会形成一个回路。

算法的具体做法如下:首先构造一个只含有n个顶点的森林,然后按权值从小到大从连通网中选择边加入到森林中去,并使得森林中不产生回路。如果选择的边会产生回路,则跳过这条边,选择下一个相较最小的边加入森林。直到最终形成一棵树,而这棵树就是连通图的最小生成树。

普里姆(Prim)算法

该算法的思想是:首先从连通网中任取一个顶点 v 作为生成树的根,之后继续往生成树中添加顶点w,则在 v 和 w 之间必有边相连,且这条边上的权值是 v 的所有连接点与之相连边上的权值最小的一个。一般情况下,从连通图中挑选顶点到生成树中的原则是它和生成树上的顶点之间的边上的权值是在连接这两类顶点(一类是已经落在生成树上的顶点,另一类是尚未落在生成树上的顶点)的所有边上权值最小的。按照此原则,依次从连通图上选取点加入到生成树上,直到所有的点都被选择,生成树建立好。

两种算法的区别

克鲁斯卡尔算法主要是对“边”进行操作,时间复杂度为O(e),而普里姆算法主要是对“顶点”进行操作,时间复杂度为O(n^{2})。前者适合稀疏图,后者适合稠密图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值