考虑我们求最小生成树的过程。
sum=∑aifi
其中 ai 单增,表示第 i 大的边,fi 表示选了权值为 ai 的边的数量。
我怎么求数量。
考虑这个问题:
保留原图边权 ≤x 的边,选择最多的边使得不构成环,答案记为 g(x)。
则 fi=g(i)−g(i−1)。
为什么。考虑任意取边,能取就取,最后的答案一定为 g(x),且 g(x)−g(x−1) 可以看成某些联通块连在一起了,也就是我们选上 fi 条权值为 ai 的边。
好了,保留边权 ≤x 的边,那么我并不需要知道值,只需要知道下标,由于边权要取 max
,那么我找到所有 pj≤i 的下标 j 记录到集合 S
,则 apj≤ai。
将 S 排序,那么保留边权 ≤ai 的边,相当于 Si 之间两两连边。
我们可以贪心,取 Si 和 Si+1,因为如果相邻 ≤k 的才有边,而这些对一定能构成边的一组解。
于是我们计数 ∑[Si+1−Si≤k],假设共有 x=ai 个数,则有 x−1 段,我们枚举是第几段,和 Si+1−Si 的值,有:
(x−1)j=1∑k(n−jx−1)
意思是我们选除了 si+1 的其他 x−1 个数,因为 si+1 可以推出来,然后因为 Si 和 Si+1 在排序后是相邻的,那么取的数不能在 [Si,Si+1] 中。
再算上排列的方案数,有:
gi=i!(n−i)!(i−1)j=1∑k(n−ji−1)
答案随便算了。
当然,可以上指标求和。