Official

Ex - Constrained Topological Sort Editorial by leaf1415


問題文中の \(2\) つの条件をそれぞれ順に条件 \(1\) 、条件 \(2\) と呼びます。 \(G\) が DAG でないときは、条件 \(1\) を満たす \(P\) は明らかに存在しないので、以下では \(G\) は DAG とします。

\(P\)\(2\) つの条件を満たすには 全ての辺 \((s, t)\) について、\(P_s \leq R_s\)\(P_s \leq P_t-1 \leq R_t-1\) を満たすことが必要です。 よって、辺 \((s, t)\) について \(R_s \leftarrow \min\{R_s, R_t-1\}\) という置き換えの操作をしても、問題の答えは変わリません。 \(G\) の適当なトポロジカル順の後方から順に、上の置き換えの操作を繰り返し行うことで、元の問題との等価性を維持したまま、全ての辺 \((s, t)\)\(R_s \lt R_t\) を満たすようにできます。 そこで、以下では全ての辺 \((s, t)\)\(R_s \lt R_t\) が成り立つと仮定します。

各整数 \(1, 2, \ldots, N\) を いずれかの頂点 \(v\)\(P_v\) として割り当てていくことで順列 \(P\) を作ることを考えます。 その過程で、整数 \(1, 2, \ldots, i-1\) までは既にいずれかの頂点に割り当て済みで、次に整数 \(i\) をいずれの頂点に割り当てる状況を考えます。 出来上がる \(P\) が条件 \(1, 2\) を満たすためには、整数 \(i\) を割り当てる頂点 \(v\) は、

  • \(L_v \leq i\) (条件 \(2\) より)かつ
  • \(v\) に入る全ての辺 \((u, v)\) について、\(u\) には既に整数が割り当てられている(条件 \(1\) より)

ことが必要です。 そのような頂点を割り当て可能な頂点と呼ぶことにします。 実は、条件 \(1, 2\) を満たす \(P\) を作るには、割り当て可能な頂点 \(v\) のうち \(R_v\) が 最小のものに整数 \(i\) を割り当てるのが最適です(証明は後述)。

つまり、本問題を解くには、

\(i = 1, 2, \ldots, N\) についてこの順に「現在割り当て可能な頂点 \(v\) のうち \(R_v\) が最小のものに整数 \(i\) を割り当てる」

という貪欲な手順を試し、 これによって条件 \(1, 2\) を満たす \(P\) が実際に得られるどうかを判定すれば良いです。 「割り当て可能な頂点 \(v\) のうち \(R_v\) が最小のもの」を得るのに優先度付きキューなど用いることで、本問題を \(O(N\log N)\) 時間で解くことができます。

最適性の証明

\(P\) を条件 \(1, 2\) を満たす順列とします。 頂点の番号を適切に振り直すことにより \(P = (1, 2, \ldots, N)\) と仮定できます(整数 \(i\) を割り当てられた頂点を頂点 \(i\) と振り直す)。

この \(P\) を作る過程において、整数 \(x\) を割り当てる局面で「割り当て可能な頂点 \(v\) のうち \(R_v\) が最小のもの」が頂点 \(y\) であったにもかかわらず、\(R_x \gt R_y\) を満たす頂点 \(x\) に整数 \(x\) が割り当てられたとします。 つまり、\(1 \leq x \lt y \leq N\) を満たす整数の組 \((x, y)\) で、

  • 頂点 \(x, x+1, \ldots, N\) から頂点 \(y\) への辺が存在しない。
  • \(L_y \leq x\)
  • \(R_x \gt R_y\)

を満たすものが存在したとします。 このとき、整数 \(x\) を頂点 \(x\) の代わりに頂点 \(y\) に割り当てていた場合に得られる順列

\[P' = (P'_1, P'_2, \ldots, P'_{N-1}, P'_N) \coloneqq (1, 2, \ldots, x-1, x+1, x+2, \ldots, y, x, y+1, \ldots, N)\]

も条件 \(1, 2\) を満たすことを示します。

まず、\(P'\) が条件 \(1\) を満たすことは、\(P\) が条件 \(1\) を満たすことと「頂点 \(x, x+1, \ldots, N\) から頂点 \(y\) への辺が存在しない」から従います。

次に、すべての \(i\)\(L_i \leq P'_i\) を満たすことは、 \(P\) から \(P'\) にかけて割り当てられた整数が小さくなった唯一の頂点 \(y\) について、\(L_y \leq x = P'_y\) が成り立つことから従います。

最後に、すべての \(i\)\(P'_i \leq R_i\) が成り立つことを示します。 \(P\) から \(P'\) にかけて割り当てられた整数が大きくなった頂点 \(x, x+1, \ldots, y-1\) について示せば十分ですが、 これらの任意の頂点 \(z\) について \(R_y \leq R_z\) が成り立つことが以下の通りわかります。

  • \(z\) が割り当て可能なら、\(y\) が「割り当て可能な頂点 \(v\) のうち \(R_v\) が最小のもの」であったことから、\(R_y \leq R_z\) を得ます。
  • \(z\) が割り当て可能でないなら、割り当て可能なある頂点 \(w\) から、頂点 \(z\) へのパスが存在しますが、全ての辺 \((u, v)\)\(R_u \lt R_v\) という仮定から、\(R_ y \leq R_w \lt R_z \) となります。

よって、\(P'_z = z+1 \leq y \leq R_y \leq R_z\) が成り立ちます。

posted:
last update: