EDPC P - Independent Set
独立集合
考え方
ABCでいうと、E問題級。
G問題の類似品。
木を根付き木のような有向非巡回グラフに加工。
トポロジカルソート。
後ろから順に動的計画法。
以上。
塗り方のパターン数を求めるには、
- その頂点が白の塗り方 = 全ての子の任意色の塗り方の積
- その頂点が黒の塗り方 = 全ての子の白の塗り方の積
- その頂点が任意色の塗り方 = その頂点が白の塗り方 + その頂点が黒の塗り方
で出せる。
黒か任意色かはどちらかだけ記録すれば十分。
もちろん両方記録してもいい。
計算量は $O(N)$。
動作例
次の入力例で考える。
5
1 2
1 3
2 4
2 5
入力を 0-indexed で受け取る。
n: 5
edges:
0 - 1
0 - 2
1 - 3
1 - 4
頂点 0 を根とする根付き木にすると、子の関係は次のようになる。
children[0]: {1, 2}
children[1]: {3, 4}
children[2]: {}
children[3]: {}
children[4]: {}
トポロジカルソート順は根から葉への順番なので、これを逆順にして葉から根へ処理する。
order: {4, 3, 2, 1, 0}
white[v] を、頂点 v を白にして v 以下の部分木を塗る方法数とする。
black[v] を、頂点 v を黒にして v 以下の部分木を塗る方法数とする。
葉である頂点 2, 3, 4 は、白でも黒でも $1$ 通りである。
white[2] = 1
black[2] = 1
white[3] = 1
black[3] = 1
white[4] = 1
black[4] = 1
頂点 1 を見る。
子は頂点 3, 4 である。
頂点 1 を白にする場合、子はそれぞれ白でも黒でもよい。
white[1] = (white[3] + black[3]) * (white[4] + black[4])
= 2 * 2
= 4
頂点 1 を黒にする場合、子は全て白でなければならない。
black[1] = white[3] * white[4]
= 1 * 1
= 1
頂点 0 を見る。
子は頂点 1, 2 である。
頂点 0 を白にする場合、子はそれぞれ白でも黒でもよい。
white[0] = (white[1] + black[1]) * (white[2] + black[2])
= (4 + 1) * (1 + 1)
= 10
頂点 0 を黒にする場合、子は全て白でなければならない。
black[0] = white[1] * white[2]
= 4 * 1
= 4
根である頂点 0 の部分木は全体なので、答えは次のようになる。
white[0] + black[0] = 10 + 4 = 14
注意点
答えは $10^9+7$ で割った余りを要求されているので、剰余類環の考えに従って処理する。
掛け算や足し算をするたびに結果を % 1000000007 する。
別解
特になし。