最小生成树
这个东西实现难度不大,就不单独打模板了。
主要是总结一下算法流程和各个算法的正确性。
kruskal:边权升序排序,每次并查集判联通,不连通则将当前边加入边集。
正确性:假设这样得出的不是最小生成树,设第一次和真正的最小生成树有偏差是在从小到大的第i条边,那么对于真正的最小生成树,一定在之后的某一条边联通这两个点所在连通块,把这条边换成前面发生偏差的那条边更优,与最小生成树假设矛盾。
prim:每次维护一个当前集合与集合外的最小边,将其加入边集。
正确性:假设这样得出的不是最小生成树,设第一次和真正的最小生成树有偏差是在第i条边,此时已经完成的点集是V。那么对于真正的最小生成树,一定在之后的某一条链接V和U-V的边联通这两个点所在连通块,把这条边换成前面发生偏差的那条边更优,与最小生成树假设矛盾。
Borůvka:初始所有点各自为独立的连通块,每次对所有连通块连接到连通块外某点的最小边。
正确性:本质上是多路增广prim,正确性同理。
破圈:边权降序排序,每次查询两端点是否在断开当前边后仍联通,联通则删边。
正确性:考虑最小生成树的边集,至少存在一颗最小生成树,上面的边一定删不掉,非最小生成树的边一定删得掉。
一些经典结论:
图的并的MST包含于图的MST的并(THUPC2022初赛A题)