偶然得知了居然还有这种神奇的算法,qwq。
老年选手觉得很有意思,所以颓废地学了一下……
简单来说,它就是一个多路增广的Kruskal。
Kruskal为什么是对的它就为什么是对的
它的流程是这样的:
1.对于每个连通块,找到一条由它内部的点连向其它连通块的最小边。
2.把这些最小边加入进去。(注意加入的时候要判它是不是连接了两个不同连通块)
3.如果已经放进去了n-1条边则退出,不然则继续。
根据启发式合并的思想,显然它只要做O(log n)次。每次加边的复杂度是O(m),
合并的复杂度是O(n),那么总复杂度就是O((m+n) log n)。
然而它好像比Kruskal不知道麻烦到哪里去了。聪明的读者纷纷表示:要它有什么用???
……
shivering太弱了,所以也不知道欸。于是询问了教我这个算法的巨佬,巨佬表示:可以拿来出题啊!出好多好多题啊!
……orz,orz。反正orz就完事了……
显然不是出最小生成树裸题用的。
我们发现,它唯一的难点在于如何给每个连通块找到它连出去的最小边。
暴力是O(m),但我们会发现,有许许多多的题目,边的数目非常大,而边权又有某种规律。
这时候,就可以套上各种各样的数据结构/dp/分治来维护它了。
采用Boruvka以后,基本就变成了另一道全新的题,爱出什么出什么。
仔细思考,prim直接n^2,Kruskal初始就