Toptree - Link & Cut編
引き続き, toptreeの解説をしていきます.
# Link
link(v, w)
: 頂点v
とw
を辺vw
で結ぶをします.
場合分けが多すぎるんじゃ
が, v
の次数が0, 1, 2以上で処理が変わり, またw
の次数が0, 1, 2以上で処理が変わります. (ちなみに論文はどちらも次数2以上のときのことしか書いてない, 全部書けや)
まず, expose(v)
をした結果はこんな感じに次数で場合分けできます. expose
した後, 次数1のときに右側にv
が来るようにします(左にあるときはreverseします)
expose(w)
をしたときはこんな感じ. expose
した後, 次数1のときに左側にw
が来るようにします.
v
が右側, w
が左側なのは, … - v
とw - …
をつなげて … - v - w - …
としたいからです.
次に, w
側のtoptreeから処理していきます.
ここでは, … - v - w - …
のv - w - …
の部分を作ります.
このそれぞれの木の根をv-w-
と表すことにして,v
側のtoptreeとつなげます. つなげ方は, v
の次数によって場合分けです. つなげるとこんな感じ
… - v - w - …
になっていると思います.
# Cut
cut(v, w)
: 頂点v
とw
を結んでいる辺vw
を切ります
link
の逆操作をすればいいです.
soft_expose
を思い出してみましょう.
vw
は辺なので, 図中の丸vw
はCompress Nodeではなく, Edge Nodeのはずです.
また, degree(v) >= 2, degree(w) >= 2
のパターンを見ると, N_w
以下がlink
でのv - w - …
の部分を作るときと形が同じです.
まあなので逆操作をするとcut
ができます.
# 記事を分けたの失敗
LinkとCut重いなあと違う記事にしたけど, 図を作ったらそんなに重くなかった
次はクエリの捌き方を書きます(これは流石に分けないとまずい)