Official

G - Good Vertices Editorial by leaf1415


頂点数が \(N\) 個で、\(t = 1, 2, \ldots, T\) について頂点 \(u_t\) から頂点 \(v_t\) への重み \(t\) の辺を持つ(その他に辺はない)有向グラフ \(G\) を考えます。

このとき、「時刻 \(t\) において頂点 \(v\) が良い頂点である」ことは、「 \(G\) で頂点 \(1\) から重み \(t\) 以下の辺のみをちょうど \(L\) 回たどって頂点 \(v\) に到達できる」ことと同値です。

したがって本問題の \(v = 1, 2, \ldots, N\) についての答えは、下記の問題の \(v = 1, 2, \ldots, N\) についての答えとそれぞれ等しいです。

\(G\) で頂点 \(1\) から頂点 \(v\) までちょうど \(L\) 回の移動で到達するときの「通る辺の重みの最大値」としてあり得る最小値を求めよ。

動的計画法(DP)でこの問題を解きます。

\(i = 0, 1, 2, \ldots, L\) および \(j = 1, 2, \ldots, N\) について、\(\mathrm{dp}[i][j]\)

\(\mathrm{dp}[i][v] := \) (ちょうど \(i\) 回の移動によって頂点 \(v\) に到達するときの「通る辺の重みの最大値」としてあり得る最小値)

とおきます。ただし、ちょうど \(i\) 回の移動によって頂点 \(v\) に到達することが不可能な場合は \(\mathrm{dp}[i][v] = \infty\) とします。

DPの初期状態を考えます。\(v = 2, 3, \ldots, N\) については、\(\mathrm{dp}[\ast][\ast]\) の定義より

\[\mathrm{dp}[0][v] = \infty\]

です。

また、便宜上

\[\mathrm{dp}[0][1] = 0\]

とします。

次にDPの遷移を述べます。 \(1 \leq i, j \leq N\) に対して、\(W(i, j)\) を「 \(G\) 上での頂点 \(i\) から頂点 \(j\) への有向辺の重み」とします。ただし、そのような有向辺が存在しない場合は \(W(i, j) := \infty\) とします。

このとき、DPの遷移式は

\[ \begin{aligned} \mathrm{dp}[i][v] &= \displaystyle\min_{1 \leq u \leq N} \max \lbrace \mathrm{dp}[i-1][u], W(u, v) \rbrace\\ &= \min\lbrace \max\lbrace \mathrm{dp}[i-1][1] , W(1, v)\rbrace, \max\lbrace \mathrm{dp}[i-1][2] , W(2, v)\rbrace, \ldots, \max\lbrace \mathrm{dp}[i-1][N] , W(N, v)\rbrace \rbrace \end{aligned} \]

と書けます。

上記の初期化と遷移によって、\(\mathrm{dp}[i][\ast]\)\(i = 1, 2, \ldots, L\) の順に計算することで、本問題の答えが

\[\mathrm{dp}[L][1], \mathrm{dp}[L][2], \ldots, \mathrm{dp}[L][N]\]

として得られます。

しかしこの方法は、\(NL\) 通りの \((i, j)\) について \(\mathrm{dp}[i][j]\) の値を計算するため、実行制限時間に間に合いません。 よって、以下でこの方法を高速化する方法を述べます。

上述のDPの遷移式:

\[ \begin{aligned} \mathrm{dp}[i][v] &= \displaystyle\min_{1 \leq u \leq N} \max \lbrace \mathrm{dp}[i-1][u], W(u, v) \rbrace\\ &= \min\lbrace \max\lbrace \mathrm{dp}[i-1][1] , W(1, v)\rbrace, \max\lbrace \mathrm{dp}[i-1][2] , W(2, v)\rbrace, \ldots, \max\lbrace \mathrm{dp}[i-1][N] , W(N, v)\rbrace \rbrace \end{aligned} \]

で、\(\max \lbrace a, b\rbrace\) を掛け算 \(a \cdot b\) に、\(\min \lbrace a, b \rbrace\) を足し算 \(a + b\) に置き換えると、

\[\begin{aligned} \mathrm{dp}[i][v] &= \displaystyle\sum_{u = 1}^N (\mathrm{dp}[i-1][u] \cdot W(u, v))\\ &= \mathrm{dp}[i-1][1]\cdot W(1, v) + \mathrm{dp}[i-1][2]\cdot W(2, v)+ \cdots + \mathrm{dp}[i-1][N]\cdot W(N, v) \end{aligned} \]

となり、これは行列を用いて

\[\left[\begin{matrix} \mathrm{dp}[i][1] \\ \mathrm{dp}[i][2] \\\vdots \\ \mathrm{dp}[i][N]\end{matrix}\right] = \left[ \begin{matrix} W(1, 1)& W(2, 1) & \cdots & W(N, 1) \\ W(1, 2) & W(2, 2) & \cdots & W(N, 2) \\ \vdots & \vdots & \ddots & \vdots\\ W(1, N) & W(2, N) & \cdots & W(N, N) \\ \end{matrix}\right] \left[\begin{matrix} \mathrm{dp}[i-1][1] \\ \mathrm{dp}[i-1][2] \\\vdots \\\mathrm{dp}[i-1][N]\end{matrix}\right] \]

と形式的に書けます。つまり、

\[\mathbf{A} := \left[\begin{matrix} W(1, 1)& W(2, 1) & \cdots & W(N, 1) \\ W(1, 2) & W(2, 2) & \cdots & W(N, 2) \\ \vdots & \vdots & \ddots & \vdots\\ W(1, N) & W(2, N) & \cdots & W(N, N) \\ \end{matrix}\right]\]

とし、\(i = 0, 1, 2, \ldots, L\) について

\[\mathbf{x}_i := \left[\begin{matrix} \mathrm{dp}[i][1] \\ \mathrm{dp}[i][2] \\\vdots \\\mathrm{dp}[i][N]\end{matrix}\right]\]

とおくと、\( i= 1, 2, \ldots, L\) について、

\[\mathbf{x}_i = \mathbf{A} \mathbf{x}_{i-1}\]

です。ただし、乗法は \(\max\) 、加法は \(\min\) として計算することに注意してください。

本問題の答えである \(\mathrm{dp}[L][1], \mathrm{dp}[L][2], \ldots, \mathrm{dp}[L][N]\) を求めるには、 \(\mathbf{x}_L\) を求めれば良いですが、これは

\[\mathbf{x}_L = \underbrace{\mathbf{A} (\mathbf{A} (\mathbf{A} (\ldots( \mathbf{A}}_L \mathbf{x}_0) \ldots)))\]

と書けます。 一般に、乗法を \(\max\) 、加法を \(\min\) としても、行列の乗法に関する結合法則

\[(\mathbf{P}\mathbf{Q})\mathbf{R} = \mathbf{P}(\mathbf{Q}\mathbf{R})\]

が成り立ちます。よって、

\[\mathbf{x}_L = \underbrace{\mathbf{A} (\mathbf{A} (\mathbf{A} (\ldots \mathbf{A}( \mathbf{A}}_L \mathbf{x}_0) \ldots))) = (\mathbf{A}^L)\mathbf{x}_0\]

と書けます。 したがって、乗法を \(\max\) 、加法を \(\min\) として、\(\mathbf{A}^L\) を繰り返し二乗法によって計算することで、本問題を \(\mathrm{O}(T+N^3 \log L)\) 時間で解くことができます。

おまけ

一般に、加法と乗法が半環をなすとき、行列の乗法に関する結合法則が成り立ち、上述のような行列の累乗によるDPの高速化が可能です。

半環とは、加法 \(+\) と乗法 \(\cdot\) という \(2\) つの二項演算を備えた集合 \(A\) であって、下記をすべて満たすものです。

  • \((A, +)\) は可換モノイドをなす。すなわち、次の \(3\) 点を満たす。

    • \(+\) に関する結合法則が成り立つ。すなわち、任意の \(a, b, c \in A\) に対して、\((a+b)+c = a+(b+c)\) が成り立つ。
    • \(+\) に関する単位元 \(0\) が存在する。すなわち、ある \(0 \in A\) が存在して、任意の \(a \in A\) に対して、\(a + 0 = 0+ a = a\) が成り立つ。
    • \(+\) に関する交換法則が成り立つ。すなわち、任意の \(a, b \in A\) に対して、\(a + b = b + a\) が成り立つ。
  • \((A, \cdot)\) はモノイドをなす。すなわち、次の \(2\) 点を満たす。

    • \(\cdot\) に関する結合法則が成り立つ。すなわち、任意の \(a, b, c \in A\) に対して、\((a\cdot b)\cdot c = a\cdot(b\cdot c)\) が成り立つ。
    • \(\cdot\) に関する単位元 \(1\) が存在する。すなわち、ある \(1 \in A\) が存在して、任意の \(a \in A\)に対して、\(a \cdot 1 = 1\cdot a = a\) が成り立つ。
  • \(+\)\(\cdot\) に関して、次の分配法則が成り立つ。

    • 任意の \(a, b, c \in A\) に対して、\(a \cdot (b + c) = a \cdot b + a \cdot c\) が成り立つ。
    • 任意の \(a, b, c \in A\) に対して、\((a+b) \cdot c = a \cdot c + b \cdot c\) が成り立つ。
  • 任意の \(a \in A\) に対して、\(0 \cdot a = a \cdot 0 = 0\) が成り立つ。

例えば、

  • \(A := \R \cup \lbrace -\infty \rbrace\)、加法 \(+\)\(\max\) 、乗法 \(\cdot\) を通常の加算
  • \(n\) を正の整数とし、\(A\)\(2^n\) 未満の非負整数の集合、加法 \(+\) をビットごとの論理和、乗法 \(\cdot\) をビットごとの論理積
  • \(n\) を正の整数とし、\(A\)\(2^n\) 未満の非負整数の集合、加法 \(+\) をビットごとの排他的論理和、乗法 \(\cdot\) をビットごとの論理積

とすると、それぞれ半環をなします。

posted:
last update: