かしのブログ

競技プログラミングとか

Typical DP Contest R - グラフ

問題

有効グラフをたどって訪れることができるノードの最大数を求める。 この操作は2回行えるが、重複したノードは一度しか数えない。

考察

強連結成分分解を行い、相互に行き来可能なノードの塊を一つのノードとみなしたDAGを考える。 DAGの各ノードのスコアを強連結成分内の元のノードの数として、DAG上でスコア付きでこの問題を解くようにする。

つぎのようなDPを考える。

 {\rm dp}[u][v] \triangleq 1回目に頂点 u、2回目に頂点 vから操作を始めたときの最大スコア

とする。 uから遷移を始めるとき、 u \rightarrow xが可能で、 x \rightarrow vが不可能なノードだけに限定する。これで、カウントの重複を防げる。

実装

atcoder.jp

感想

頂点の直接の子でなくても到達可能なら一気に飛ばすのも、そもそも訪れる頂点を制限する発想は面白い。