ARC(AtCoder Regular Contest) 030 C - 有向グラフ

C: 有向グラフ - AtCoder Regular Contest 030 | AtCoder

[問題]

n個の頂点とm本の辺の有向グラフがある。各頂点には'a'-'z'のアルファベットが1個ある。任意の頂点から開始してグラフをたどり、アルファベットを合計k個順番に取る。各頂点では取っても取らなくてもいい。循環していれば一回スキップして後で取ってもいい。取得した文字列の辞書順最小を求める。存在しなければ-1を返す。

 

[解答]

(終了後)

強連結成分分解でループしているところをグループ化する。各グループの文字はどの順番でも取れるのでソートしておく。

グループを順にたどり、文字数ごとに、それまでに作成できた最小の文字を記録する。

(DP[グループ][文字数]で最小の文字列を記録)

 

[コード](C++)

https://paiza.io/projects/icf5SNr67K43_VO65QhPzg

 

[感想]

O((N+M)*N*K*26)かな。他の人の解答や解説を見ながらだけど、はじめての強連結成分分解。少し慣れないと競技中には難しそう。DPの初期値文字列は"~"とする方法もありそう。