其他分享
首页 > 其他分享> > [WC2012]最小生成树

[WC2012]最小生成树

作者:互联网

网上还没有题解,就简单写一下。

什么情况下最小生成树不唯一?

考虑一般的kruskal:将边排序后贪心选择。

其实等价于把权值最小的边(可能有多条)找出来,在这些边中选一个生成森林,然后把连通块缩成一个点。

(缩点后相当于一个规模较小的子问题,用相同的方法处理)。

所以说当且仅当其中任意一步出现环时,最小生成树不唯一。

这题实际上是多个题拼起来,所以分别讲解。


第一部分 $a=10^9,b=1$ ,也就是只能增加权值。

考虑每次选出权值最小的边,其中可能会连出一些环。

如果有环,那么本次选择生成森林方法不唯一,于是需要增加环上一些边的权值使得其唯一。

那么至少需要改动的边数等于总边数减去生成森林的边数(生成森林外的边都要改动)。

与kruskal类似,把连通块缩成一个点,然后用相同的方法处理。具体实现类似kruskal。


第二部分 $a=1,b=10^9$ ,也就是只能减少权值。

同样考虑每次选出权值最小的边,其中可能会连出一些环。

第一部分可以做的操作是强制不选环上的一些边,这部分则是强制选。

但是对于所有的割边,不需要减少其权值也一定会在生成森林中出现。

对于其它的边,选出一颗生成森林即可。

于是就是第一部分加上一个tarjan。


第三部分点数很少,可以爆搜/手玩。

第四部分观察后猜测每一个边双连通分量的点数都不多,写个tarjan验证发现最多只有(好像是) $12$ 个点。

而且同一块内边权全部相等,显然可以状态压缩dp。

设 $dp_{S}$ 表示在 $S$ 集合内最小生成树唯一的最小花费,然后枚举另外一个集合转移。

只需要知道两点分别在两个集合中的边数,就可以知道强制选一条/强制不选其它的花费。

明显求出的答案不会小于真实答案,如果要证明这个算法一定能找到最优解,只需考虑修改后的图的最小生成树即可。

时间复杂度 $O(3^n)$ ,但是有很多连通块点数很少,跑个几分钟就出解了。

代码就不贴了,写的太丑而且还是假的(中间有一部分写假了,但是过了)。

标签:连通,kruskal,WC2012,最小,生成,权值,森林
来源: https://www.cnblogs.com/2005lz/p/15988742.html