G - Big Banned Grid Editorial by Iroha_3856

公式解説の補足

公式解説の補足をします。 本質は同じなので、コードは公式解説と同様です。

{左の壁 または 下の壁} から {右の壁 または 上の壁} へと障害物マスを八近傍で辿っていけるのと、\((1, 1)\) から \((H, W)\) へと行く経路は存在するのは同値です。

以下の例を参考にしてください。


障害物を#、空きマスを.で表しています。

...
.##
#..

\((3, 1) \rightarrow (2, 2) \rightarrow (2, 3)\) という経路が存在するので、\((1, 1)\) から \((H, W)\) へと行く経路は存在しません。

...#
...#
##..

{左の壁 /下の壁} から {右の壁 / 上の壁} へと障害物マスを八近傍で辿っていく経路は存在しないので、\((1, 1)\) から \((H, W)\) へと行く経路は存在します。


\(K+2\) 頂点のグラフを用意して、それぞれの頂点に 障害物、{左の壁 / 下の壁} 、{右の壁 / 上の壁} を対応させ、八近傍で隣接している場合にのみ頂点間に辺を張ることにします。

どのような頂点間に辺があるかは障害物の座標を管理する連想配列を用いて \(O(K \log K)\) 程度で求めらるので、そのグラフにおいて {左の壁 / 下の壁} と対応する頂点と {右の壁 / 上の壁} と対応する頂点とが連結かを(BFS/DFS/Union-Findなどで)適切に判定すれば答えを求めることができます。

実装例:https://atcoder.jp/contests/abc413/submissions/67363469

posted:
last update: