6.21 CW 模拟赛 T3. 最小生成树
思路
不妨令 \(a < b\)
首先不难发现根据 \(\rm{kruskal}\) 的思想, 显然应该是所有边权为 \(a\) 的边先加入, 再加入 \(b\) 的边
考虑这个过程
先把所有边权为 \(a\) 的边加入之后的图实际上也不是确定的, 但是我们可以知道产生的联通块情况, 然后再在联通块之间连 \(b\) 边, 具体怎么连也是不确定的
现在的问题是对于源点 \(s\) 和每个点 \(u\), 我们想知道在一棵合法的最小生成树中 \(s \to u\) 的最小值
考虑刻画一棵合法的最小生成树上路径 \(s \to u\) 的性质
- 性质 \(1:\) 只有在通过两个联通块之间时可以使用 \(b\) 边
- 性质 \(2\) \((\)事实上是性质 \(1\) 的补丁\()\)\(:\) 不能重复经过一个联通块
考虑如何处理符合上述两个性质的最短路
对于性质 \(1\), 我们只保留合法的 \(b\) 边
对于性质 \(2\), 我们在转移时加一维 \(\mathbb{S}\) 表示已经通过过的联通块
总的复杂度是 \(\mathcal{O} (m 2^n \log (n 2^n))\)
这什么神人东西
考虑优化
子任务 \(3\) 给了一个 \(b \geq 100a\) 的提示, 这是干嘛的?
感性理解就是 \(b\) 很劣
数学上来讲, 因为我们如果经过已经通过过的联通块, 必然经过了至少 \(2b\), 又因为 \(2b \geq 200a, m \leq 200\), 所以走两个 \(b\) 一定不优于正常走 \(a\), 可以不用考虑性质 \(2\)
在这个基础上思考正解
还是因为我们如果经过已经通过过的联通块, 必然经过了至少 \(2b\)
对于节点数 \(\leq 3\) 的联通块, 是不存在走两遍的更优解的, 于是我们只需要约束节点数 \(> 3\) 的联通块的状态, 状态数降到了 \(n / 4\)
于是复杂度变成了 \(\mathcal{O} (m 2^{n / 4} \log (n 2^{n / 4}))\), 因为 \(\textrm{dijkstra}\) 的小常数, \(3\rm s\) 过应该没啥问题
总结
\(\rm{Kruskal}\) 的贪心性质
这道题本质上是可以转化成合法情况的最值问题, 考虑约束之后进行了一些优化

浙公网安备 33010602011771号