071 - Fuzzy Priority(★7)
順列の前後の情報を有向グラフだと思ってトポロジカルソートをする
トポロジカルソートの数え上げは#P-Complete(だったっけ?) なので多項式時間では無理だが、10個列挙するくらいならDFSで可能
入次数0=候補の先頭にしてよい ならばdequeに入れ、構成中の最後尾にdequeの先頭を追加する。今追加した頂点から出ている辺を見て、もし新たに入次数0になったらdequeに追加する。再帰的に探索した後逆操作を行いdequeを元に戻す。そして最初入っていた要素をdequeの最後尾に回す。
dequeが空かつ構成中の数列が長さNでない場合は矛盾しているので不可能。これとK個見つけ終わった場合は枝狩りすることで高速に動く。
やることは分かるけど実装が難しいタイプ