University of Aizu Programming Contest 2014 (AOJ 1548) Yu-kun Likes a Directed Graph
お題箱より。
解法
重み の負辺を足してできるだけ重み合計が大きい( に近い)負閉路を作りたいので、与えられたDAGについて「1本以上の辺で構成されるパスであって、重み合計が 未満であるもののうち一番大きいものの重み」が分かれば良いです。
ここで であること、さらに元々のDAGにある辺の重みは非負であることに注目します。これらの条件から、最終的に見つけるパスも、その一部となるパスも、重みが 以下のものだけを考えれば良いことが分かります。
よって以下のようなDPテーブルを構成し、 の範囲で計算していけば良いです。
- :1本以上の辺で構成され、頂点 で終わるパスであって、重み合計が となるものが存在するか?(true/false)
トポロジカル順序に基づいて順番に計算していきます。遷移は頂点 から頂点 への重み の辺が存在する時に、
- から始まり で終わるパス: をtrueにする
- 以外から始まり で終わるパス: がtrueである について、 をtrueにする
とすれば良いです。
時間計算量は となり高速な言語ならそのままでも間に合いそうですが、bitsetを用いて高速化することもできます。