Codeforces 1108F
Posted littlewyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1108F相关的知识,希望对你有一定的参考价值。
题意
给定1个无重边自环的无向联通图。你可以增加各边的边权,边权每增加1,算作1次操作。
询问最小的操作数,使得MST不变,且MST方案唯一。
题解
1种很直观的思路是,执行Kruskal的途中,若某边权为\(val\)的边会导致环的出现,且该环中存在边权为\(val\)的边;为了方案的唯一性,应使其不可能被选,显然将其边权加1即可。
很遗憾的是,惊喜之下我混淆了环与联通块的概念,将代码写成了这样。当时以为反正\(val\)为最大边权,则环与联通块可以等价;殊不知由于相同边权的存在,会对\(val\)不在环中而在联通块中的情况误判。一定要仔细考虑真正的阶段以及同阶段元素的相互作用!类似的经验也可以看Codeforces 459E。
我们直接求环内边权最大值并不太容易。
考虑在不完善的思路上打补丁——排除环内无相同边权而联通块内有相同边权的情况。
这等价于该环去除该边后的原链不可能被任何边权为\(val\)的边更新;
进一步等价于在所有边权为\(val\)的边进入前,该链已经联通。
故只要在访问边权为\(val\)的边前,先统一标记两顶点已经联通的边,并在实际求解中跳过,即可将环与联通块等价。其余步骤不变,不再赘述。
当然,如果对Kruskal有更好的理解,就不必像我这样兜这样大的弯子。
Kruskal本质上的阶段是边权大小(而不是边),因而应对每堆边权为\(val\)的边整体考虑;
则显然加入这堆新边前顶点已联通的边不可能被选,直接跳过;剩余的边照常Kruskal,若某边不能加入MST中,则应将该边边权加1。累计即为所求。
回顾与思考
心静才能做好题。急躁只能坏事。
欲速则不达。请1点点磨平你性格中的缺陷,深度思考,谨慎做题。
以上是关于Codeforces 1108F的主要内容,如果未能解决你的问题,请参考以下文章
Two distinct points CodeForces - 1108A (签到)
Codeforces Round #535 (Div. 3) 1108C - Nice Garland