对Kruskal算法的一些理解&各种MST
首先我们来回顾一下Kruskal的基本思想和原理 第一次发文,好激动
原理
我们每次先把边按照权值大小进行排序,然后我们从小到大开始进行选择,每次判断边的两个端点所在的连通块是否相同,不同则将它选入MST并继续向下考虑
理解
通过上面的过程我们可以获得一些好的思路,比如边的选取只是与它在边的序列中的排名有关系,而与其他的因素无关。这样我们完全可以在大部分时候无视除最小生成树边以外的其他边,只留下n-1条最小生成树边,这样对于所有对边进行的操作(如删除或增边),如果不在这一段区间中则可以忽略,否则我们就只需要对这个区间进行修改与调整。这样大大地简化了我们的思维复杂度
各种各样的MST
这些东西应该都是老生常谈了,在刘汝佳蓝书上应该已经快被翻烂了,但本文还是将它们拿出来说一说
最小生成树
最普通的一种,就不再赘述了
最小瓶颈生成树
可以从字面上来理解,它就是指这一棵生成树上,所有树边权值的最大值最小的那一棵树(MST)。通过上面的“理解”我们可以很容易知道所有的最小生成树都一定是最小瓶颈生成树,反之并不一定
最小瓶颈路
这个东西指的是一条从u到v的路径,这条路径它满足其经过的所有边中权值的最大值最小(其中u和v都是给定的)。它的求法仍与最小生成树有关。我们可以先求出原图的最小生成树,然后在这棵树上寻找u和v的树上路径,那么这条路径即为所求。这样做为什么是对的呢?我们可以用上文所述的“理解”来进行证明(如采用反证法),这里不再赘述。由此我们也能看到Kruskal带给我们的理解是多么地重要
每对节点间最小瓶颈路
这其实就是对上面内容的一个小扩展。刘汝佳给出了一个时间复杂度为O( n