3506 < UOA UAPC < Challenges | Aizu Online Judge
問題
xy 平面上の 2 つの点が以下を満たすとき、これらは互いに「接続している」という。
- x 座標か y 座標が同じである。
xy 平面上に $N$ 個の点がある。 $i$ 番目の点の座標は $(x_i, y_i)$ である。 これらのうち、互いに接続しているものの間に線分が引かれている。これを「接続線」という。
いくつかの点を接続線上に追加することで、接続する頂点のみを辿って、点 $1$ から点 $N$ へ移動できるようにしたい。 これが可能か判定し、可能なら追加する必要のある頂点の最小個数を求めよ。
制約
- $2 \leq N \leq 10^5$
- $|x_i|, |y_i| \leq 10^9$
考察
まず互いに行き来可能な頂点の集合に分ける。これは UnionFind でできる。
そのうち $j$ 番目の集合について、点が存在する領域を $[lx_j, rx_j] \times [ly_j, ry_j]$ とする。 このとき、集合 $j$ 内の接続線上に以下の操作を行うことができる。
- 好きな $x \in [lx_j, rx_j]$ について、x 座標が $x$ である点を追加できる。
- 好きな $y \in [ly_j, ry_j]$ について、y 座標が $y$ である点を追加できる。
よって「点を 1 つ追加することで、 $j_1$ 番目の集合から $j_2$ 番目の集合へ行けるようにできる」というのは、「 $[lx_{j_1}, rx_{j_1}]$ と $[lx_{j_2}, rx_{j_2}]$ か、 $[ly_{j_1}, ry_{j_1}]$ と $[ly_{j_2}, ry_{j_2}]$ の少なくとも一方が交わる」と同値となる。
そのような集合間に辺を張ったグラフを作れば、BFS で答えが求まる。 しかし辺の本数は最大 $\Theta(N^2)$ になるので、陽にグラフを持つことはできない。
ここで「 $[lx_{j_1}, rx_{j_1}]$ と $[lx_{j_2}, rx_{j_2}]$ が交わる」というのを、 「 $x \in [lx_{j_1}, rx_{j_1}]$ と $x \in [lx_{j_2}, rx_{j_2}]$ を満たす $x$ が存在する」と言い換える。 すると以下のような解法が浮かぶ。
まず各 x 座標に対応する頂点を用意する。 そして $j$ 番目の集合からは、各 $x \in [lx_{j}, rx_{j}]$ と双方向に辺を張る。ただし $x$ へ向かう方の重みを $0$ 、向かってくる方の辺を $1$ とする。 こうすることで、 $[lx_{j_1}, rx_{j_1}]$ と $[lx_{j_2}, rx_{j_2}]$ が交わるときに限り、 $j_1$ から $j_2$ へ( $x$ を経由して)コスト 1 で向かうことができるようになる。
座圧すれば x 座標の候補は高々 $N$ 個にできるが、辺の本数が多すぎる。 そこで「区間に対して辺を張るテク」というのを使うと、集合毎に張る辺の本数を $O(\log n)$ 本に抑えられる。 詳しくは こちら を参照。
後は y 座標に対しても同様にグラフを構築し、01-BFS や Dijkstra 法で最短距離を求めればよい。
実装例
Run #4866106 < misteer < Solutions | Aizu Online Judge
|
|