克鲁斯卡尔算法?

生成树:一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。

最小生成树:把构造连通网的最小代价生成树称为最小生成树。(一棵生成树的代价就是树上各边的代价之和)。

克鲁斯卡尔算法(主要针对边来展开,边数少时效率会非常高,所以对于稀疏图有很大的优势)

1、主要思路,如下图所示:

按权值递增的顺序将连接了两棵树的边 (0,2),(3,5),(1,4),(2,5) 依次改为红边,加入 T 中。 

由于边 (0,3) 的两个顶点在相同的一棵树上,所以舍去。而边 (2,4) 和 (1,2) 的长度相同,可以任选其中一条加入。

如上图所示,红色连接的部分就是生成的最小生成树。

}

简介  这篇文章主要介绍了【数据结构】最小生成树之普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法以及相关的经验技巧,文章约44953字,浏览量603,点赞数1,值得参考!

如图假设v0到v8表示9个村庄,现在需要在这9个村庄假设通信网络。村庄之间的数字代表村庄之间的直线距离,求用最小成本完成这9个村庄的通信网络建设。

  • 这幅图只一个带权值的图,即网结构。

  • 所谓最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使权值的和最小。

如果无向连通图是一个网图,那么它的所有生成树中必有一颗是边的权值总和最小的生成树,即最小生成树。


找到连通图的最小生成树,有两种经典的算法:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

  • 从图中某一个顶点出发(这里选V0),寻找它相连的所有结点,比较这些结点的权值大小,然后连接权值最小的那个结点。(这里是V1)

  • 然后将寻找这两个结点相连的所有结点,找到权值最小的连接。(这里是V5).

  • 重复上一步,知道所有结点都连接上。

  • 创建了两个数组adjvex和lowcost。adjvex[0] = 0意思就是从V0开始,lowcost[0] = 0表示V0已经被纳入到最小生成树中。之后凡是lowcost数组中的值被设置为0就是表示此下标的顶点被纳入最小生成树。

  • 普里姆算法的时间复杂度为O(n^2),因为是两层循环嵌套。

普里姆算法是从某一顶点为起点,逐步找各个顶点最小权值的边来构成最小生成树。那我们也可以直接从边出发,寻找权值最小的边来构建最小生成树。不过在构建的过程中要考虑是否会形成环的情况

在直接用边来构建最小生成树的时候,需要用到边集数组结构,代码为:

  • 先构建边集数组,并排序,所以前面有对权值进行排序的方法sort。

克鲁斯卡尔(Kruskal)算法主要针对边来展开,边数较少时效率非常高,所以对于稀疏图有很大的优势;

普里姆(Prim)算法对于稠密图,边数非常多的情况更好一些。

}

我要回帖

更多关于 证明克鲁斯卡尔算法的正确性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信