Description
题目链接:BZOJ 1016
给出一个由 $n$ 个点和 $m$ 条边构成的简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(两棵最小生成树是不同的当且仅当它们有至少有一条边不同)。方案数对 $31011$ 取模。
数据范围:$1\le n\le 100$,$1\le m\le 1000$
Solution
简化版
由于在 $\text{MST}$ 中,每种权值的边的数量是固定的,那么我们先统计出每种权值需要多少条边,记为 $c_i$。
我们发现具有相同权值的边的数量不超过 $10$ 条,那么我们暴力枚举第 $i$ 种权值的边选择哪 $c_i$ 条,然后根据乘法原理来统计答案。(这个算法已经可以通过本题)
注意:我们为了能够快速分开连通块,并查集中不能使用路径压缩!
时间复杂度:$O(2^{10}m)$
加强版
我们考虑加强版:每种权值的边不超过 $100$ 条。我们就需要矩阵树定理了。
注意到 $\text{MST}$ 有如下性质:
- 每种权值的边的数量是固定的。
- 不同的生成树中,某一种权值的边任意加入需要的数量后,形成的联通块状态是一样的。
这样一来,我们可以枚举树边的权值 $i$,把权值不是 $i$ 的树边都加入图中后进行缩点;对于权值为 $i$ 的原图中的边,在缩点后的图中构造基尔霍夫矩阵,用矩阵树定理求出方案数。
最终的答案也是根据乘法原理计算。
时间复杂度:$O(n^3\log n)$(大概是这样吧,这个算法我不怎么会算呀 QAQ)
Code
简化版
1 |
|
加强版
1 |
|