かしのブログ

競技プログラミングとか

Typical DP Contest N - 木

問題

 N頂点の木を書く。 木を書いている途中で、すでに書いている全ての辺が連結になるような書き方の数を求める。

atcoder.jp

考察

根付き木の根からの生やし方の数を考える。 根付き木のノード数が1のとき1通り。 根の k個の子を根とする部分木のノードの数が n_1, n_2, \cdots, n_k、生やし方の数をそれぞれ p_1, p_2, \cdots, p_kとする。 この根付き木の生やし方の数は

 \prod_{i = 1}^k p_i \cdot \dbinom{\sum_{c=1}^i n_c}{n_i}

である。これはDFSで求めることができる。

全ての辺に対して、その辺を根とみなすと全てのバターンを計算できる。

実装

atcoder.jp