ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC133 E - Virus Tree 2

問題
提出コード

解法

探索か何かをしつつ、今いる頂点について色を決ようとすると、その頂点から距離2以内で、すでに色が決まっている頂点がいくつあるかを調べる必要があり、とても大変です。
そこで、今いる頂点から行くことができる頂点について、色を決めることについて考えてみます。
f:id:emtubasa:20190708153456p:plain
上のような木について考えてみます。白い頂点が既に通過済みの色を塗られている頂点で、青い頂点が今いる頂点です(ここも色はすでに決まっています)。そして、クリーム色の頂点が、今から色を決める頂点になります。
3つのクリーム色の頂点に、順番に色を塗っていくことを考えると、
1番目の頂点にはK-2、2番目はK-3、3番目はK-4通りの塗り方が考えられます。
1番目の頂点は、白と青の頂点の分だけ色の選択肢がなくなり、2番目以降の頂点は、今塗ったクリーム色の頂点の色だけさらに選択肢が消えていきます。
同様のことがこの後も続きます。
f:id:emtubasa:20190708154112p:plain 例えば、先ほどの図から実はさらに頂点が存在していたとします。先ほど、青い頂点にいる際に、クリーム色の3つの頂点に色を塗りました。そして、今緑色の頂点に移動してきたとします。
緑色の頂点から行ける、親を除く頂点について色を塗ります(今回は水色の頂点になります)。
この場合も、水色から距離2以下の頂点のうち、すでに色が塗られているのは、今いる緑の頂点と、その親である青い頂点の2つのみになり、色塗り方は1番目の頂点がK-2、2番目がK-3、3番目がK-4通りとなります。

ということで、
DFSか何かで頂点を探索しつつ、今いる頂点から次に行くことができる頂点について、
 K - 2 - i ( ただしi0以上(次に行くことができる頂点数-1)以下の任意の数字 )
をかけていけばよいです。
が、一番最初の根はK通りであることと、そこから行ける頂点のみ、K - 1 - iであることに注意しなければなりません。
これを繰り返していけば、答えを求めることができます。

感想

この問題結構面白いと思いました。
コーナーケースに引っかからずに書けるようになりたいですね(今回はサンプルが合わないのでいいのですが…)