CF1383C

发布时间 2023-11-10 08:37:07作者: zzafanti

solution

先做 easy version(A题)
只需考虑小写字母点对。每个小写字母是图里一个节点。
相当于给定一些 \((x_i,y_i)\) 的限制。
然后在图中连边,每个连边表示一次操作,把部分起点的字母变成终点的字母。
要求所有 \(x_i\) 可达 \(y_i\),求最小连边数量。
由于 \(x_i<y_i\) 的限制,一个弱联通块内可以用一条链连起来,easy version 的答案就是 \(|\Sigma|-\) 弱连通块数量。

来考虑 hard version

这些 \((x_i,y_i)\) 会构成环。我们不妨先选出来一些限制,使得它们不成环,加入其他限制就会成环。
所有这些限制都可以当做链的终点出发的一条“返祖边”。一个链对答案的贡献就是链的大小 -1 + “返祖点”的个数。
枚举返祖点,然后检查剩下的点和限制是否是 dag,更新答案即可。

实现上我用的 floyd 判环,\(2^{|\Sigma|}\times |\Sigma|^2\),理论上 \(\Sigma = 20\) 会 TLE,但是加了点剪枝,跑的飞快。

code

Submission #232163532 - Codeforces