ARC039 D. 旅行会社高橋君
問題
N頂点、M辺からなる無向グラフが与えられる。(多重辺や自己ループはなし)
Q個の「同じ辺を通らず、頂点aから頂点bを通って頂点cに行くことができるか?」のクエリがくるので、それに答える。
N<=10^5
M<=20^5
Q<=10^5
各クエリのa,b,cは互いに異なる
考え方
行くことができないケースを考える。
a-x-c | b
上記のような場合、bに行って戻るために2回辺を通らないといけない。
グラフ理論では、上記のような辺を「橋」といい、橋を含まない連結な無向グラフを「二重辺連結成分」という。
上記の問題は、二重辺連結成分に分割し、橋でそれらを連結したグラフを考えると、木になるので、木において、aからcのパスにbがあるかどうかの判定になる。
木においてaからcのパスにbがあるかどうかの判定は、a〜bの距離とb〜cの距離の和がa〜cの距離と一致するかで判断でき、木の距離はlcaを使って高速に求めることができる。
二重辺連結成分は橋を除いたグラフでUnionFindで頂点をまとめあげれば作成できる。
橋を除いたグラフは、橋をみつけることができれば作成できる。
橋は、根を適当に決めて、dfsで辿って、すでにたどった点に戻る辺を見つけ、その辺の両端をつなぐ別のルートはこの辺がある限り橋にはなり得ないので、全部の辺をたどってそうならなかった辺が橋となる。
これは愚直にやるとO(NM)程度かかってしまうが、imos法で上記のような辺の両端で+1,-1とし、葉ノード側から累積していけばO(N+M)で求められる。
また、全体的にメモリを無駄遣いしやすくMLEしてしまうので、節約(使い終わったらfree)する。