ABC139E - League
問題概要
N 人の選手が大会に参加する。各選手は 1 日 1 試合しか行えず、番目の選手はの順に試合を行う必要がある。試合の日程をこの条件を満たすように決めることは可能か。可能であれば全ての試合が完了するまでにかかる最小日数を求めよ。
制約
は全て異なる。
解法
グラフとして考える
2 人の選手の試合を行うことができる条件を考えてみる。
選手はとなるまでの試合(の選手と戦うまでの全ての試合)を終えている必要がある。の試合を終えているためにはの試合が終わっている必要があるため、結局が終わっていることだけを見ればよい。
選手についても同様に、となるについて、の試合を終えている必要がある。
まとめると、
- となるについて、を終えている (x=0 ならは存在しない)
- となるについて、を終えている (y=0 ならは存在しない)
の 2 つを満たせばの試合ができ、とを消化することができる。このように、任意のの組の試合を行うためには、個のある組の試合が行われている必要がある。
この関係を図示してみると、なら
と、選手の組を頂点とした有向グラフとして表現できる。
このグラフでは各辺が日から日目の移動を表しているため、このグラフの最長パスの長さを求めることで、答えを求めることができる。グラフを構築するのに必要な計算量は、各選手の組(頂点)に対して張るべき辺はで分かるので、合わせてとなる。
残る問題としては、
- 試合日程を組めないケースをどのように検出するか
- グラフの最長パスをどのように求めるか
がある。
日程を組めないケースの検出
入力例で日程を組めないケースとなっていたについてグラフを作ってみる。
このように、明らかに日程が組めないことが分かる。全ての試合が他の試合に依存しているためである。 このようなグラフはトポロジカルソートが可能かどうかによって判定できる。
グラフの最長パス
まず、計算対象のグラフはトポロジカルソートができるので、DAGであることが保証される。DAG の最長パスは、以下のようにして求めることができる。
- 各頂点に対し、その頂点に訪問するまでにかかる最長距離を持っておく。最初は全ての。
- 各頂点をトポロジカル順序で見ていき、以下を行う。
- 現在見ている頂点と隣接する頂点に対し、で更新する。
このアルゴリズムは全ての頂点に対してその頂点に隣接する辺を見るので、頂点数を、辺数をとしてとなる。、から出る辺は高々 2 つなのでとなる。
まとめ
選手の組みを頂点とし、先に終えておく必要がある選手の組みの試合を辺で表現することでグラフを構築する。グラフの最長パスが解となる。グラフの構築が、最長パスを求めるのがなので、全て合わせてである。