有关最小生成树Kruskal正确性的证明与研究

Kruskal的模板我已经会了快一年了?然而我并不知道为什么他是对的,只是大概觉得没什么问题。。。但是学到后面发现,觉得自己懂了,然而一出题就GG了。要是对于一个算法不完全理解的话,是很难继续进步的,于是我决定要重新来学习一下Kruskal算法的正确性证明。

首先,要先知道一个显而易见的东西:一个图的最小生成树方案不止一种,相信这个小学生都能理解


然后,有一个推论:对于图中任意一个点x,对于x点连出去的所有边,边权最小的一条至少存在于一棵最小生成树上

对于这个推论的证明我想了一会,其实也不难。假设现在边(x,y),是x最短的一条,那么我们现在考虑将x,y连接起来(最小生成树的任意两点一定是连通的嘛),那么就只有两种不同的情况,直接连通和间接连通,我们现在就是要证明直接连通至少不比间接连通差。既然要间接连通,那么假设这条路是x——>a——>b.......——>y,其实这个最终连接的效果是可以等效于a——>b.......——>y——>x的,然而这里唯一的区别就是一个选择了了x——>a,一个选择了y——>x,那么我们知道选择(x,y)的代价肯定是不差于(x,a)的,证毕


有了这个推论后,你就可以大致体会到Prim算法的原理了,同时你也可以自己证明一个结论:对于任意一个图,他最小生成树中每种权值的边的数量是一定的(这是一个ACbzoj1016的重要结论,当然用的时候也是背的。。)


除此之外我们就可以得到另外一个结论:如果某个连通图属于最小生成树,那么所有从外部连接到该图的边中的一条最短的边必然属于最小生成树。

这个结论也很好证明,就把之前的最小生成树看做一个点就好了。


于是我们就可以得到:当最小生成树被拆分成彼此独立的若干个连通分量的时候,所有能够连接任意两个连通分量的边中的一条最短边必然属于最小生成树。这个也是把每个连通分量看做一个点就好了。       也就是Kruskald的核心思想了!


然后我们再来探究一下最小生成树别的性质:

对于任意一个连通图,图中A点走到B点的所有路径中,最长的边最小值是肯定出现在最小生成树中A到B的路径上。

这个用Kruskald的做法来证明好了。首先在最小生成树上A——>B的路径肯定是唯一的,这个没毛病。就是说短的边会被先选上,所以最终使得A和B连通的最后一条边也是最短的,这也就保证了最长的边最短!!

于是有了这个性质,我们就可以来做bzoj的3732了。(我搞了几个小时的最小生成树就为了做一道题。。)


你可能感兴趣的:(最小生成树)