AtCoder Beginner Contest 213

E

考虑使用 $\rm bfs$

观察到每一步的代价都是 $0$$1$于是建立双端队列每次迭代取队头如果走了代价为 $0$ 的边就将出点加入队首否则加入队尾

考虑其正确性因为走代价为 $0$ 的边不会增加当前点的答案所以可以维护住当前取出的点一定是答案最小点的性质

时间复杂度 $\Theta(nm)$

另外这种模型还可拓展到代价为 $0 \sim k$只需要对每种贡献维护一个队列即可容易发现仍然满足单调性时间复杂度 $\Theta(nk)$

G

考虑使用状压 $\rm DP$

$f_S$ 表示仅考虑 $S$ 的导出子图令它与 $1$ 连通的方案数$cnt_S$ 表示 $S$ 导出子图中的边数显然有

$$ans_k = \sum _ {1, k \in S} f_S \times 2 ^ {cnt_{U-S}} $$

考虑容斥求解 $f_S$

$$f_S = 2 ^ {cnt_S} - \sum _ {1 \in T, T \subsetneq S} f_T \times 2 ^ {cnt_{S - T}} $$

求解两部分的时间复杂度分别为 $\Theta(n ^ 2 2 ^ n)$$\Theta(3 ^ n)$

另外后半部分可以使用 $\rm FWT$ 优化或卷积做到 $\Theta(n ^ 2 2 ^ n)$

H

考虑 $\rm DP$$f_{i, j}$ 表示到 $i$ 为止经过长度为 $j$ 的路径的方案数$E_{u, v, w}$ 表示从 $u$$v$ 长度为 $w$ 的路径数量显然有转移方程

$$f_{i, j} = \sum _ {k = 1} ^ n \sum _ {l = 1} ^ T f_{k, j - l} \times E_{k, i, l} $$

考虑用 $\rm GF$ 拟合这个过程$F_i(x) = \sum \limits_{j} f_{i, j} x ^ j$$G_{i, j}(x) = \sum \limits_ {k \geqslant 1} E_{i, j, k} x ^ k.$ 有方程

$$F_i(x) = \sum _ {j = 1} ^ n F_j(x) \times G_{j, i}(x) $$

使用分治多项式乘法即可时间复杂度 $\Theta(n ^ 2 T \log ^ 2 T)$

Code Link