淺談基環樹(環套樹)


淺談基環樹(環套樹)

本篇隨筆簡單講解一下算法競賽中的基環樹。也叫環套樹。


一、基環樹概念

其實我個人更喜歡叫它基環樹。更好理解。

它的標准定義是:具有N個點N條邊的連通圖。

如果不保證聯通,它就會成為基環樹森林。

上張圖直觀理解一下。

這就是一棵基環樹。

如果我們把中間那個醒目的環斷開任意一條邊,它就會成為一棵樹,如果我們把這個環全部斷掉,就會成為一個森林。


二、內向樹和外向樹

啥?樹還會害羞么?

所謂內向樹的定義是每個點有且只有一條出邊。也就是這棵樹給人的大體感覺是向內的。

所謂外向樹的定義是每個點有且只有一條入邊。也就是這棵樹給人的大題感覺是外向的。

比如上面的基環樹,變成內向樹就是:

變成外向樹就是:

嗯,也就是基環樹變成有向圖的一種子定義。


三、基環樹的處理

根據上面的定義介紹,我們可以感覺到,基環樹雖然被單獨拿出來討論,但是其本質上還是一個比較簡單且好理解的數據結構之一。所以它只能適當地提升題目難度,並不能說一個樹的題變成基環樹就大大增強了。

一些經典例題有:

基環樹直徑、基環樹兩點之間距離,基環樹DP,等。

這些模型的解決通法一般是:

斷環成樹,然后將若干棵樹處理好之后,再考慮環對答案的影響。也就是將環、樹分開討論解決問題。這時,用”環套樹“這個名詞來形容基環樹,很是容易理解。

比如例題:

ZJOI2008騎士

這道題是基環樹DP的題目,在這道題中,我們對每一棵基環樹斷掉環上的一條邊,然后對斷開的兩個點分別跑樹形DP,就可以得到正確的答案。

總的來說,基環樹的一種常用處理方式是”斷環“。

再比如例題:

IOI2008島嶼

這道題要求基環樹的最長鏈。

基環樹的最長鏈有兩種情況:

第一種是在某棵樹里,不經過環。

第二種是經過環。

所以我們可以先用一次DFS找出環,在每個環上節點出發處理樹上的最長路徑,並計算出從根節點最遠到達節點距離根節點的距離。顯然,如果經過環的話,肯定要經過這個最大的距離。

所以比較即可。

總的來說,基環樹的另一種常用處理方式是分類討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM