TopCoder SRM 654 Hard
2016-03-30 |
[Competitive programming]
writer 解と違う解き方っぽいですが面白いなーと思ったので書いておきます
概要
n 個の頂点からなる木構造をした家がある.n 頂点のうち 2 頂点は出入り口になっている.
n 個の家具を家に搬入し,各部屋にちょうど 1 個ずつの家具を置くようにしたい.家具は互いに区別されるが,どの家具をどの部屋に置いてもかまわない.
家具は,2 つの出入り口のどちらかから搬入し,目的の部屋までの最短路を通過して目的の部屋に置く.
家具はとても大きいので,一度家具が置かれた部屋を以降通過することはできない.
家具の置き方の場合の数を mod 1000000007 で求めよ.
解法
2 つの出入り口 s1, s2 を結ぶパスを考え,パスの上で最初に荷物が置かれる場所が p であるときの場合の数を A(p) とする.
また,パスの上の 2 頂点 p, q を結ぶ辺 p–q を使用禁止にしたときの場合の数を B(p, q) とする.
すると,B(p, q) = A(p) + A(q) であることがわかる.
なので,2 * (答え) = 2 * ΣA(p) (p はパス上の頂点) = A(s1) + A(s2) + ΣB(p, q) (p–q はパス上の辺) となる.
A(s1), A(s2) は,それぞれ出入り口 s1, s2 を無視して DP を行うと求められる.
また,B(p, q) は s1, s2 側でほぼ独立に解けるので,これで答えの 2 倍が求まる.すると 1000000007 は奇数なので答えはただちに求まる.
コード