淺談基環樹(環套樹)
本篇隨筆簡單講解一下算法競賽中的基環樹。也叫環套樹。
一、基環樹概念
其實我個人更喜歡叫它基環樹。更好理解。
它的標准定義是:具有N個點N條邊的連通圖。
如果不保證聯通,它就會成為基環樹森林。
上張圖直觀理解一下。
這就是一棵基環樹。
如果我們把中間那個醒目的環斷開任意一條邊,它就會成為一棵樹,如果我們把這個環全部斷掉,就會成為一個森林。
二、內向樹和外向樹
啥?樹還會害羞么?
所謂內向樹的定義是每個點有且只有一條出邊。也就是這棵樹給人的大體感覺是向內的。
所謂外向樹的定義是每個點有且只有一條入邊。也就是這棵樹給人的大題感覺是外向的。
比如上面的基環樹,變成內向樹就是:
變成外向樹就是:
嗯,也就是基環樹變成有向圖的一種子定義。
三、基環樹的處理
根據上面的定義介紹,我們可以感覺到,基環樹雖然被單獨拿出來討論,但是其本質上還是一個比較簡單且好理解的數據結構之一。所以它只能適當地提升題目難度,並不能說一個樹的題變成基環樹就大大增強了。
一些經典例題有:
基環樹直徑、基環樹兩點之間距離,基環樹DP,等。
這些模型的解決通法一般是:
斷環成樹,然后將若干棵樹處理好之后,再考慮環對答案的影響。也就是將環、樹分開討論解決問題。這時,用”環套樹“這個名詞來形容基環樹,很是容易理解。
比如例題:
這道題是基環樹DP的題目,在這道題中,我們對每一棵基環樹斷掉環上的一條邊,然后對斷開的兩個點分別跑樹形DP,就可以得到正確的答案。
總的來說,基環樹的一種常用處理方式是”斷環“。
再比如例題:
IOI2008島嶼
這道題要求基環樹的最長鏈。
基環樹的最長鏈有兩種情況:
第一種是在某棵樹里,不經過環。
第二種是經過環。
所以我們可以先用一次DFS找出環,在每個環上節點出發處理樹上的最長路徑,並計算出從根節點最遠到達節點距離根節點的距離。顯然,如果經過環的話,肯定要經過這個最大的距離。
所以比較即可。
總的來說,基環樹的另一種常用處理方式是分類討論。