牛客CSP-S提高组赛前集训营2 T2沙漠点列
原题链接 算法不难,比赛的时候就和cyc大佬一起yy了正解,不过因为交的时候比较急(要回寝室惹),我有两数组开错大小直接爆到50,cyc大佬则只把文件输入关了一半,直接爆零(╯ ̄Д ̄)╯┻━┻ 要尽量使 \(k\) 次删边都能有贡献,那么很容易就想到割边。 所以我们先用 \(\mathtt{tarjan}\) 跑出所有割边,而每一条割边都能产生 \(1\) 的贡献,因此有 \(sum_{bridge}\) 条割边,就能增加 \(sum_{bridge}\) 个连通块。 若 \(k \leqslant sum_{bridge}\) ,那么最后的答案就是 \(k + s\) (设原来的图有 \(s\) 个连通块)。 若 \(k > sum_{bridge}\) ,那么先删去这些割边,则剩下 \(k' = k - sum_{bridge}\) 条删边的次数。 然后我们考虑剩下的图该怎么去删边使贡献最大。 很容易发现删去割边后的图就是单个简单环或多个以点连接的简单环的集合。 对于多个以点连接的简单环,实际上我们可以把这多个连接的环拆成多个单环,如下图所示: 因为虽然将多个环拆开来会多出几个点,但是与此同时也增加了相同数目的连通块,因此对拆开后的多个单环进行删边的最大贡献是与原图相同的。 然后我们考虑怎么在这单环集合中删边使得贡献最大化,显然对于一个环