【參考】
★WC2017-immortalCO Making Graph into Trees
【DFS樹】
仙人掌圖:每條邊至多在一個環上的圖。
仙人掌圖中每個環相當於一個點雙連通分量,那么用Tarjan算法處理dfs樹。
對於樹邊(low[y]>dfn[x])直接處理,環邊先忽略。
每個環只在其深度最小的點x處理,設深度最大的點為y,則找到(x,y)並進行處理(fa[y]≠x&&dfn[y]>dfn[x])。
例題:【BZOJ】1023: [SHOI2008]cactus仙人掌圖 靜態仙人掌(DFS樹) 求直徑,建立DFS樹,環上單調隊列維護。
例題:【BZOJ】4316: 小C的獨立集 靜態仙人掌 求最大獨立集,建立DFS樹,環上動態規划。
【圓方樹】
原圖每個點都是圓點,非環邊直接相連。對於每個環,新建一個方點連接這個環的所有圓點(環邊不連)。
建圖方法同DFS樹,在處理環的時候連接方點。取出一個環只要取出方點的所有鄰點即可(按順序)。
例題:【BZOJ】2125: 最短路 圓方樹(靜態仙人掌) 求多源最短路,建立圓方樹,找LCA。
【點雙】
對於無向連通圖,對每個點雙建立一個方點連向其中所有點並消除點雙內部的連邊,這樣就是廣義圓方樹。
例如經典的旅行問題:詢問帶點權無向圖中,兩點間所有簡單路徑的最小權值。
兩點間的簡單路徑並=兩點間的唯一點雙鏈。(如果存在一條其它路徑到達,則與已有點雙矛盾。)
所以建立廣義圓方樹后就是查詢樹鏈最小值的問題了。(每個方點的權=連接圓點的最小權)