足跡-sokuseki-

りかの日進月歩の記録

ABC036 D 塗り絵

D - 塗り絵

はじめての木DPです。

問題概要

 N 頂点の木が与えられる。
両端の頂点が黒で塗られるような辺がないように、頂点を白または黒でぬるとき、塗り方の通り数を  10^9 + 7 で割ったあまりを答えよ。

制約
 1 \le N \le 10^5


解法

漸化式を立てて木の上でDPをしましょう。

 f( x ) := 頂点  x を親とする部分木に含まれる頂点をすべて白または黒で塗り、両端が黒で塗られた辺が存在しないようにする方法の通り数。
 g( x ) :=  f( x ) と同じ。ただし、頂点  x は必ず白で塗らなければならない。

とすると、以下の2つの漸化式を作れる(ただし、 y_1 , y_2 , … , y_k  x の子とする)。

  •  f( x ) = g( x ) + g( y_1 ) \times g( y_2 ) \times … \times g( y_k )
  •  g( x ) = f( y_1 ) \times f( y_2 ) \times … \times f( y_k)

なぜこの漸化式がつくれるのかは、次のサイトがわかりやすいです、これで理解しました。
漸化式を立てて「tree DP問題」を解く D - 塗り絵 - マツシタケイタの技術ブログ(勉強中)

あとは、木の葉から順番に  f( x )  g( x ) を埋めていくことで、  O(N) で求められる。
葉から根にむかって順番に求めるには、dfsをつかって根まで行き、帰りがけに計算すればよい。

Submission #2117216 - AtCoder Beginner Contest 036