ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最小生成树:破圈法

2020-05-04 22:02:40  阅读:4898  来源: 互联网

标签:连通 破圈法 回路 最小 生成 算法 权值


目录

避圈法

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,在一个连通图中的所有生成树中,存在如此各边代价之和最小的生成树,则称该生成树为该联通网的最小代价生成树
我们熟知的 Prim 算法和 Kruskal 算法可以用来找到最小生成树,不过这两种算法的思想其实是一致的:一开始我只有有限的信息,无论是所有顶点做加边法,还是所有的边做加点法,一开始的信息都是不完整的。其实无论是加点还是加边,本质上是从最小的权的边开始,添加的是在未选中的边中的最小权值边,原理都是使用了 MST 性质去做的。
在做 Prim 算法和 Kruskal 算法时我们比较关心每添加了一次边就检查看看有没有出线回路,因为生成树是不能有回路。那也就是说我要避免回路的出现,在重复添加最小权值边时就能保证将最小生成树添加出来,这种手法就被称为避圈法

破圈法

现在我们来考虑另一种思路,避圈法是把最小生成树建出来,现在我有全套的信息,我要怎么把最小生成树找出来?由于最小生成树是 n 个顶点 n - 1 条边,因此我需要将边的数量减少到 n - 1 条,一旦我满足了这点就可以认为是找到了最小生成树。
所以现在的问题是怎么找需要删除的边?回顾一下什么叫生成树,生成树是没有回路的,那也就是说我只需要把边给删除掉,使得该结构不存在回路即可。当然你可能要问了直接随意删除不就好了吗?这样剩余 n - 1 条边绝对是不存在回路的。但是这么做可能会导致本来我的生成树是可以保证连通的,但是就被拆成了多个部分,这个不是我们愿意发生的事情。所以删除边的时候都需要验证这条边的有或无是否导致回路的存在。
还有一个问题是,如果我漫无目的地删除边,那么这样得到的生成树未必不是最小生成树。这个问题解决还是比较容易的,我直接去找现有的权值最大边即可,然后判断回路存在后直接把最长边。这样每次操作的都是最长边,剩余的边就会是短边,对应的生成树就是最小生成树。

模拟生成

我们还是拿这个图结构来看,首先对于破圈法来说,我拥有全套信息。

接下来我去找权值最大的边,应该是 3-5,判断一下有这条边将存在回路,删除。

继续寻找权值最大的边,应该是 1-4,判断一下有这条边将存在回路,删除。

继续寻找权值最大的边,应该是 2-5,判断一下有这条边对生成树存在回路是没有影响的。因为现在回路存在于 0,1,2 这 3 个点(用橙色标出) 2-5 的存在与否并不影响,因此保留。

继续寻找权值最大的边,应该是 0-2,判断一下有这条边将存在回路,删除。

此时边的数量已经缩小至 n - 1,说明构造完毕。

判断回路是否存在

先说说“图论”的事

先左转看一下什么是"欧拉回路",请看博客欧拉回路的存在性

华沙尔算法

看上去算法好像很简单,但是实际写代码我们就马上回遇到回路的存在性问题。因为这个问题不是验证图是否连通,而是删除边之后是否还联通,所以很明显是在并查集服务区之外。所以现在我们就遇到知识盲区了,下面我就介绍一种从期刊论文学到的算法:华沙尔算法。所谓华沙尔算法,这主要用来对付用邻接矩阵存储的图结构的连通性判断。算法的流程是:

  1. 获取图的邻接矩阵 g,若图为有向图需要先忽略方向变为无向图;
  2. 遍历邻接矩阵 g,若矩阵的边 g[i][j] != 0,则对于 k(0 ≤ k ≤ g.n) 来说 g[i][k] = g[i][k] + g[j][k],则用这个信息去修正邻接矩阵的值,得到邻接矩阵的可达矩阵。可达矩阵只关心路径是否存在,不关心权值,因此可以用 bool 型变量去描述,或者用 0 和 1 就好;
  3. 统计可达矩阵中的路径数 sum,若 sum != g.n2 则表示图不连通
  • 若 sum == g.n2,则还需要进一步分析时弱连通还是强连通,这里不多叙述,详情可以阅读参考的期刊论文。

伪代码

代码实现


标签:连通,破圈法,回路,最小,生成,算法,权值
来源: https://www.cnblogs.com/linfangnan/p/12827529.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有