0%

【题解】CF1929E - Sasha and the Happy Tree Cutting

题目链接

https://codeforces.com/contest/1929/problem/E

题目大意

给定一颗 \(n\) 个结点的树,给定 \(k\) 条树上的路径 \(a_i, b_i\)。现在要对树上的一些边染色,使得 \(k\) 条路径中的每一条路径上都至少有一条边被染色,问最少染多少条边。

数据范围

  • \(2\le n \le 10^{5}\)
  • \(1 \le k \le 20\)

解题思路

考虑统计每一条边被那些路径覆盖,假设覆盖第 \(i\) 边的路径集合为 \(S_i\),那就是要找到一个长度最短的序列 \(p_1, p_2, \cdots, p_m\) 使得 \(S_{P_1} \cup S_{p_2} \cup \cdots \cup S_{p_m} = \{1, 2, \cdots, k\}\)

我们联想到了状压 dp,但发现直接 dp 复杂度是 \(O(n\cdot 2^{k})\),是行不通的。

因为路径条数非常少,我们可以猜测本质不同的集合 \(S_i\) 的个数跟 \(k\) 是一个级别的。

证明可以考虑建出这 \(2k\) 个点的虚树,由于虚树上最多只有 \(4k - 1\) 个结点,\(4k - 2\) 条边,所以最多只有 \(4k - 2\) 种本质不同的 \(S_i\)​。

有了上面的结论我们就可以直接 \(O(nk)\) 地 dp 了。

参考代码

https://codeforces.com/contest/1929/submission/246624331