Toptree - Link & Cut編

niuez.hatenablog.com

引き続き, toptreeの解説をしていきます.

Link

link(v, w): 頂点vwを辺vwで結ぶをします.

場合分けが多すぎるんじゃ

が, vの次数が0, 1, 2以上で処理が変わり, またwの次数が0, 1, 2以上で処理が変わります. (ちなみに論文はどちらも次数2以上のときのことしか書いてない, 全部書けや)

まず, expose(v)をした結果はこんな感じに次数で場合分けできます. exposeした後, 次数1のときに右側にvが来るようにします(左にあるときはreverseします)

f:id:niuez:20190805114250p:plain

expose(w)をしたときはこんな感じ. exposeした後, 次数1のときに左側にwが来るようにします.

f:id:niuez:20190805114301p:plain

vが右側, wが左側なのは, ... - vw - ...をつなげて ... - v - w - ...としたいからです.

次に, w側のtoptreeから処理していきます.
ここでは, ... - v - w - ...v - w - ...の部分を作ります.

f:id:niuez:20190805114321p:plain

このそれぞれの木の根をv-w-と表すことにして,
v側のtoptreeとつなげます. つなげ方は, vの次数によって場合分けです. つなげるとこんな感じ

f:id:niuez:20190805114331p:plain

... - v - w - ...になっていると思います.

Cut

cut(v, w): 頂点vwを結んでいる辺vwを切ります

linkの逆操作をすればいいです. soft_exposeを思い出してみましょう.

f:id:niuez:20190805073700p:plain

vwは辺なので, 図中の丸vwはCompress Nodeではなく, Edge Nodeのはずです. また, degree(v) >= 2, degree(w) >= 2のパターンを見ると, N_w以下がlinkでのv - w - ...の部分を作るときと形が同じです.
まあなので逆操作をするとcutができます.

記事を分けたの失敗

LinkとCut重いなあと違う記事にしたけど, 図を作ったらそんなに重くなかった

次はクエリの捌き方を書きます(これは流石に分けないとまずい)