AtCoder Beginner Contest 223 D 問題 Restricted Permutation
問題
提出解答
問題の概要
以下の条件をすべて満たす の並び替え は存在するか? 存在するならば, そのような並び替えのうち, 辞書式最小のものを求めよ.
- において, は よりも先に現れる
制約
解法
この問題はトポロジカルソートとして可能な結果のうち, 辞書式最小なものは何か? という問題である. そもそも, トポロジカルソートとは, 有向グラフ において, 以下のようにして実行される.
- を空リストとする.
- に出次数 の頂点をすべて入れる.
- が空で無い限り, 以下を実行する.
- から適当な頂点 を選び, から取り除く.
- の末尾に を加える.
- 頂点 と に入る全ての有向辺 を全て取り除き, 出次数が の頂点を全て に加える.
- のとき, トポロジカルソートが存在し, がその例である.
ここで, このアルゴリズムでは から取り出す頂点に制限はない. ここで, を にあるもののうち, 最小のものという風に選んだ場合, トポロジカルソートが存在する場合の は順序の定義から, 辞書式最小のトポロジカルソートになる. よって, 以下のようなアルゴリズムで求めることができる.
- を空リストとする.
- に出次数 の頂点をすべて入れる.
- が空で無い限り, 以下を実行する.
- の最小値 を から取り除く.
- の末尾に を加える.
- 頂点 と に入る全ての有向辺 を全て取り除き, 出次数が の頂点を全て に加える.
- のとき, は辞書式最小のトポロジカルソートである.
ここで, のデータ構造において, 優先度付きキューを用いることにより, 計算量 で求めることができる.