【Cactus仙人掌圖】仙人掌DP學習筆記,cactusdp
我們從例題入手來考慮仙人掌上DP的一般規律叭.
Ex 1.仙人掌上的單源最短路問題
聯想樹上最短路,由於路徑的唯一性可以直接做一遍O(n)的搜尋.但是仙人掌上顯然不具備路徑的唯一性這種性質.
那麼我們是否需要像對待一般的無向連通圖一樣使用最短路演算法呢?
其實並不需要.
首先一遍DFS處理出仙人掌的結構關係.
然後我們從起點開始DP,假設當前DP到節點為x,那麼枚舉x的每一個兒子.如果該兒子節點是一個普通節點,那麼我們直接可以得到起點到這個節點的距離.如果該兒子節點是個環,則枚舉環上每一個節點v,求出v到起點距離,再從v開始DP.
同樣是一個O(n)的DP.比起無腦跑最短路優越到不知道哪裡去了!
Ex 2.求仙人掌的直徑
對於有邊權和無邊權的情況我們一起處理.(無邊權當成邊權為1)
依然先考慮樹的情況.對於樹的直徑,我們可以使用樹形DP,對每個節點求出其深度和以其為根的子樹的最大深度,然後每個節點不同兒子的最大深度+次大深度即為答案.
那麼仙人掌也是類似的.
首先還是一次DFS處理出仙人掌的結構.
先提出一個子仙人掌的概念,子仙人掌x為刪掉節點x到根的所有簡單路徑上的邊後x所在的連通塊.
在處理出仙人掌結構之後,我們對每個節點處理出其子仙人掌的最大深度.
對於一個節點,依然可以使用不同兒子的最大深度+次大深度來更新答案.
對於一個環,可以用環上每對節點的最大深度加上這對節點之間的最短路長度來更新答案.
此時我們有兩個方法來解決:
1.枚舉環上的一個節點,那麼如果存在一個節點與當前節點的最短路是從當前節點出發順時針走,這兩個節點一定對應著環上的一個區間.而且不難發現,如果我們當前枚舉的節點順時針移動,這個區間的終點也會同樣順時針移動.處理這種兩個端點都單調移動的RMQ問題,可以用單調隊列來維護.
2.我們從環的父親開始,按向下走哪邊比較近,把環分成兩個部分.可以發現,這兩部分內部點對的最短路一定在內部.因此對於每個結點,它在另一部分最短路是順時針走的一定是一個首碼,最短路是逆時針走的是一個尾碼,直接處理首碼max和尾碼max即可。
根據這兩個例題我們可以看出,除了要DFS處理仙人掌結構是一定的以外,仙人掌上非環點的DP其實和樹上DP是基本一樣的,在處理仙人掌DP時候比樹上DP多的就是怎樣處理環上的點.
通常仙人掌上的DP都與距離有關,因此我們可以從上面兩個例題中擷取靈感來推廣到更多問題.
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。