AtCoder Beginner Contest 236 G 問題 Good Vertices
問題
提出解答
問題の概要
有向グラフ が与えられる. 部分有向グラフ を として,
とする. に対して, 次を満たすような は存在するか? 存在するならば最小値を求めよ.
- において, 頂点 から へちょうど 本の有向辺をたどって移動できる.
制約
- に多重辺は存在しない.
解法1 (問題の言い換え)
結局は以下の問題を解くことになる.
有向グラフ において, 頂点 から頂点 への有向歩道のうち, 使う辺の本数がちょうど であるものは存在するか? 存在するならば, このような有向歩道において使用する辺の重み最大値として可能な最小値を求めよ.
解法2 (動的計画法の導出)
動的計画法で解くことを考える. で頂点 から頂点 へちょうど 本の有向辺からなる有向歩道における利用する辺の最大値の最小値とする. ベースケースと更新式は,
となる. ただし, に対して,
する.
解法3 (行列累乗での高速化)
更新式において, 2つの演算 をそれぞれ に対応させると, 更新式は
ここで, この更新式を観察してみると, 以下の式と類似していることがわかる.
次正方行列 において, であるとき, である.
このことを念頭に入れる. 代数系 は の単位元を , の単位元を に持つ擬環になる. この擬環において, とすると, の第 成分は に一致する.
よって, 行列累乗を利用することにより, を計算量 で求めることができる.