专栏文章

CF2041N Railway Construction 题解

CF2041N题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@minz38pc
此快照首次捕获于
2025/12/02 10:42
3 个月前
此快照最后确认于
2025/12/02 10:42
3 个月前
查看原文
一个性质都没想到,还卡常卡了半天结果找个 AI 帮我卡了下直接进两秒了,感觉要被 AI 替代了。

为了方便,我们把点按照点权从小到大重标号一下,接下来默认点权单调不减。
先不考虑删点。
考虑没有这 mm 条禁用边的情况,此时显然把所有点都连到 11 号点上就是 MST。
那么有了这 mm 条禁用边,我们可以把每个点连到最小的没有被禁用的点上,去一下重边,这样肯定是最优的,但是这样连完图不一定是连通的。不过,这个图有一个性质:
性质 11:每个点连向最小可连的点之后,连通块个数是 O(m)O(\sqrt{m}) 的。
证明:假设有 kk 个连通块,那么这些连通块中点权最小的点,两两之间不能有边,所以 m=O(k2)m=O(k^2)k=O(m)k=O(\sqrt{m})
于是,我们再在这个图上跑不带堆优化的 O(V2+E)O(|V|^2+|E|) 的 prim 算法,就能得到在这种带有特殊性质的图下,一种 O(n+m)O(n+m) 的求最小生成树的方式。
这其中可能有一个问题,就是两个连通块之间的最小边权如何计算的问题。设连通块 p,qp,q 之间的边数为 mp,qm_{p,q},那么我们找出连通块 pp 中点权最小的 mp,q+1m_{p,q}+1 个点,并到 qq 中找到它们分别能连的最小点即可。这样对于两个连通块复杂度是 O(mp,q)O(m_{p,q}) 的,总复杂度就是 O(mp,q)=O(m)\sum O(m_{p,q})=O(m) 的。
接着考虑删点怎么做,比较自然的,我们先求出原图的 MST,然后在这基础上考虑。有这样一个性质:
性质 22:原图的 MST 只有 O(m)O(\sqrt{m}) 个非叶子节点。
证明:点 ii 要成为非叶子节点,就需要有点 pp 不能连向点 1i11\sim i-1,那么就需要 O(i)O(i) 条禁用边,而这些点编号不同,编号总和为 O(m)O(m),有自然根号点数为 O(m)O(\sqrt{m})
那么对于叶子节点显然我们可以 O(1)O(1) 求出答案,而对于 O(m)O(\sqrt{m}) 个非叶子节点,直接对每个都重跑一遍 O(n+m)O(n+m) 求 MST 即可,时间复杂度就是 O(nm+mm)O(n\sqrt{m}+m\sqrt{m}) 的,足以通过。
对于无解的判断有不少细节,如果原图求不出 MST,先特判以下 n=2n=2 的情况,此时输出两个 00。否则如果有一个点对其它所有点的边都被禁用了,那么就对这个点跑一遍 MST,其它的全输出 1-1 即可。否则如果没有这样的点但还是求不出 MST 的话,说明无论删哪个点,原图都能分成两个中间没有边的连通块,全输出 1-1 即可。
代码写的比较烂,但还是放一下吧:submission

评论

1 条评论,欢迎与作者交流。

正在加载评论...