传送门
思路:
首先我们得明白 Kruskal
的操作过程:对最小的边进行贪心
那我们就有一个想法,对于一条在 MST
中的边 \(e\) ,只有与它权值相同的边才有可能去替换它
那我们就统计图中某个权值 \(val\) 的边数 \(cnt\),再统计实际选入 MST
里的权值为 \(val\) 的边数 \(ch\)
显然,如果 \(cnt==ch\) ,那么这种边权的边一定都要选;如果 \(ch==0\) ,代表这种边权的边一定都不用选
那万一这两种情况都不是,是不是就是可能选了?
显然不是的,例如下图:

假设边权都是 1 ,如果我们单看左边那个环,确实是都是 可能选中
;但再看环外伸出的那条边,如果不选它,我们就连生成树都做不出来了
因此我们需要换个思路
正解:
显然,对于小于当前边权值 \(val\) 的边,它们之中无论选那些边,对于我决策当前边是等价的:即连通块的情况相同
所以我们就考虑将相同的边放在一起决策
对于一条连接 \(u,v\) 的边,如果 \(u,v\) 已经在同一个连通块内,显然这条边是一定不用选的,因为前面边权更小的边一定更优,我们就不再继续考虑这些边
而对于连接不同连通块的边,它有可能是 必选项
,也可能是 有可能选项
到这里我们不难看出,如果不选择某一条边,会导致两个连通块无法连通(仅限于考虑权值相同的边的情况下),那它就是必选项
换而言之,我们将连通块都缩成一个点,并加入权值相同的边,如果某条边是 桥(割边)
,那么它就是必选项
最后剩下的就是可能选的边
总结:
代码:
#include
#include
#include
#include
#include
#include
#include
#include