1. 程式人生 > >仙人掌&圓方樹學習筆記

仙人掌&圓方樹學習筆記

仙人掌&圓方樹學習筆記

1、仙人掌

圓方樹用來幹啥?

——處理仙人掌的問題。

仙人掌是啥?

(圖片來自於\(BZOJ1023\))

——也就是任意一條邊只會出現在一個環裡面。

當然,如果你的圖片想看起來舒服一點,也可以把圖片變成這樣子

(圖片來源於網路)

2、DFS樹

為啥要寫這個?--因為這個看起來也可以解決一些仙人掌的問題。

對於一個仙人掌,我們隨便構建出一棵生成樹。

然後我們就多了一些邊——可以叫返祖邊,非樹邊……你想叫啥就叫啥。

因為每條邊只會出現在一個環中,

所以每一條返祖邊覆蓋了樹中的一條鏈,這條鏈+這條邊構成了環。

所以我們可以確定每條邊都出現在了哪個環中。

這樣子可以解決一點點仙人掌的問題。

比如仙人掌的最大獨立集,\(dp\)的時候額外記錄一下所在環的返祖邊的端點的狀態就好了。

3、圓方樹是啥

看WC2017的營員交流的課件真的看得想死

先來定義一下什麼是圓方樹。

以下內容來自於課件:

仙人掌 \(G = (V, E)\) 的圓方樹 \(T = (V_T , E_T )\) 為滿足以下條件的無向圖:
\(V_ T = R_ T ∪ S_ T , R_ T = V, R_ T ∩ S_ T = ∅\),我們稱$ R_ T$ 集合為圓點、\(S_ T\)
集合為方點
\(∀e ∈ E\),若 \(e\) 不在任何簡單環中,則 \(e ∈ E_T\)
對於每個仙人掌中的簡單環 \(R\)

,存在方點 \(p_ R ∈ S_ T\) ,並且 \(∀p ∈ R\) 滿
\((p _R , p) ∈ E_ T\) ,即對每個環建方點連所有點

聽說你看完挺混亂?

我來翻譯一下:

對於一個仙人掌,它的圓方樹如下定義:

首先分為了兩類點,一類是圓點,一類是方點。

圓點就是原仙人掌中所有的點,方點是我們新新增進去的點。

而圓方樹的連邊規則是這樣的:

如果一條邊在仙人掌中不屬於任何一個環中,那麼它直接圓方樹中的兩個圓點。

對於仙人掌中的任意一個環,則每個環上的點在圓方樹上對應的圓點向這個環對應的方點連邊。

如何證明圓方樹是一棵樹?

(以下內容來自於課件)

不在環上的邊在圓方樹中依然存在,

因此這些邊連通性不變;

每個環通過新建方點的方式連成一朵菊花,連通性不變。

因此圓方樹是無向連通圖。

原圖中環的個數為 \(|E| − |V| + 1\),則
\(|V _T | = |S _T | + |R_ T | = |V| + |E| − |V| + 1 = |E| + 1,|E _T | = |E|\)

(大小為\(r\) 的環在仙人掌和圓方樹中都是 \(r\) 條邊),因此滿足 \(|V_ T | = |E_ T | + 1\)

證明分為了兩步:

首先證明它是聯通的。

然後就證明了點數=邊數+1

這樣就是一棵樹了。

然後讓我把課件上的一張圖片給蒯過來

好的,圓方樹就長成這個樣子啦。

4、如何構建圓方樹

我想,看了上面的東西,知道了圓方樹是啥,我們很容易就知道怎麼構建圓方樹了吧。

首先\(Tarjan\)縮點,把每個大小超過\(1\)的環裡面的所有點都向一個新點(方點)連邊。

然後把多出來的連結兩個圓點的邊直接給連上就好了。

似乎真的很簡單?

5、圓方樹的性質

1.方點不會直接和方點相連

證明:

方點只會和屬於一個強連通分量的點相連,顯然不會和方點相連。

2.無論取哪個點為根,圓方樹的形態是一樣的

證明:

這不還是廢話嗎?

對於一個環,我們顯然對應的是一個方點,無論以哪個點為根,

這個環是不會變的,除了方點的編號不一樣之外就沒有任何不同了。

所以圓方樹是無根樹。

定義:子仙人掌

\(r\)為根的仙人掌上的點\(p\)的子仙人掌是去除掉\(p\)\(r\)的所有簡單路徑後,\(p\)所在的聯通塊

3.以\(r\)為根的仙人掌上\(p\)的子仙人掌就是圓方樹中以\(r\)為根時,\(p\)子樹中的所有圓點

證明:

如果\(p\)不在環上,顯然成立。

否則,此時去除所有到達根節點的所有簡單路徑後,

剩下的只有和\(p\)相連的,並且不和\(p\)在一個環內的點

顯然是圓方樹上\(p\)子樹中的圓點(和它在一個環內的圓點都不和它直接相連了)

6、如何解決仙人掌上的一些簡單的問題

a.求仙人掌的最大獨立集(BZOJ4316)

這道題目顯然有直接用\(dfs\)樹的\(dp\)求法,見這裡

但是我們是在學習仙人掌,所以當然要用仙人掌的方法來求解啊。

其實這裡圓方樹沒有必要出來,沒有必要區分圓點和方點。

我們也是直接做\(dp\),但是與\(dfs\)樹不同的是,

我們直接在\(Tarjan\)過程中做\(dp\)(似乎本質也是\(dfs\)樹?)

碰到圓圓邊(圓點和圓點直接的邊)就是普通的樹型\(dp\)進行轉移

如果是一個環上的邊的話,那麼我們先暫時不進行操作。

當回到這個環的最上方的時候,對於這個環就行一次單獨的\(dp\)

將答案累加給環的頂端,這樣向上轉移又和樹一樣了

和普通的樹求直徑用一樣的\(dp\)就可以了。

對於一個環,拉出來特殊考慮,用一個單調佇列維護一下。

具體的實現方法戳這裡

c.仙人掌兩點間的最短路(BZOJ2125)

構建出圓方樹(圓方樹:終於需要用到我了),直接把圓方樹樹鏈剖分(主要是用來求\(LCA\))

圓圓邊和原仙人掌是同構的,圓方邊的權值定義如下:

我們知道方點的父親一定是圓點(轉換為有根樹之後),

這樣子把每條圓方邊的權值賦為到達方點父親的最短路徑就好啦。

更加詳細的題解和程式碼戳這裡

這一部分的小節

前兩個問題似乎用不到圓方樹,只需要普通的\(dp\)即可解決。實現的方法和普通的樹型\(dp\)是類似的,但是也有幾點區別:首先不是普通的\(dfs\),而是\(Tarjan\)演算法的實現過程中,順帶解決\(dp\)問題。另外一個是仙人掌上的問題需要額外處理環的問題,每次找到環之後需要特殊處理。所以,解決這類問題也就是兩步:首先想好怎麼在樹上解決(圓圓邊如何解決),然後想好怎麼處理環的答案。

第三個問題就需要用到圓方樹啦,然而本質仍然是處理環和普通的樹邊之間的關係,只需要把這層關係想清楚,這一類問題應該還是比較好解決的。

7、廣義圓方樹

前面的圓方樹只能解決仙人掌的問題。

那麼,對於一個一般的無向圖,我們顯然也是可以利用圓方樹來解決的(要不然我寫什麼廣義圓方樹啊?)

我們在仙人掌中是對於每個點雙構建一個方點,在一般圖中我們也這麼做。

然後方點向所有點雙中的點連邊,差不多和仙人掌上的圓方樹是一樣的啦。

當然,和仙人掌上的圓方樹是有區別的啦,仙人掌上的圓方樹是圓圓點之間是可能有邊的。

那麼,廣義圓方樹呢?

先蒯張圖過來(來自\(ppl\)\(blog\))

發現了啥?

圓點和方點是相間的,怎麼搞?——強制把兩個點也看成一個點雙就好了

先找到題目來吧

帶修改,求無向圖中兩點之間所有簡單路徑上的最小權值(CF487E)

當然了,這道題目有翻譯好的版本UOJ#30,洛谷

首先我們不考慮修改,再來想想這道題目。

我們既然要求的是最小值,那麼,在經過一個點雙的時候,走的一定是具有較小權值的那一側。

所以說,我們可以讓所有的方點表示它所在的點雙的最小權值,

這樣子只需要對於圓方樹樹鏈剖分之後維護鏈的最小值就行了。

好的,迴歸帶修改,無非是要動態的維護一下方點的最小權值了。

你問我怎麼動態維護若干個值的最小值?搞個\(multiset\)不就好了嗎?

但是,現在問題又來了,如果每次修改一個點的權值(這個點當然是圓點啦),

那麼,必定會修改所有和它相鄰的方點,如果是一個菊花樹,然後我們拼命修改根節點,這樣子複雜度就起飛了。

現在讓我們開啟腦洞,大力思考一下怎麼辦?

我們強行讓方點的權值不包括它的父親(也就是隻算它的兒子)

如果求解的時候\(LCA\)是方點,則額外計算一下方點父親的權值

這樣子每個圓點在修改的之後只需要向上修改給父親方點啦!

於是,我們得到了\(Tarjan\)+圓方樹+樹鏈剖分+線段樹+\(multiset\)\(O(nlog^2n)\)的做法啦

(為什麼要手寫可刪堆啊?\(multiset\)不好嗎?)

程式碼和題解

8、完結撒花

呼,終於寫完啦。

最後再來總的說一說仙人掌和圓方樹。

對於仙人掌,我們對應的圓方樹唯一。

無論是廣義圓方樹還是普通的圓方樹,和普通的樹相比,唯一的區別就是要額外考慮方點的貢獻。

總的來說,就是碼農+思維題啦,只要想清楚方點的處理,一切都很好辦了。

相關推薦

仙人掌&學習筆記+簡單應用

仙人掌&圓方樹學習筆記 前言 一直覺得仙人掌和圓方樹是非常高深的演算法。 直到連續隨機跳題跳到兩道。我受不了啦!!! 於是點進了一個連結。(傳銷現場有木有啊!) 推薦連結 :戳這裡 然後發現並沒有想象中那麼難。 而且,,, 很好玩。 日常賽前學演算法(大

仙人掌學習筆記

以後會逐漸完善,現在會先存放一些程式碼 廣義圓方樹對於每個仙人掌的環新建一個方點,原仙人掌上的點為圓點,向這個環上的所有圓點連邊,使得所有的邊連線的都是 $ 1 $ 個圓點和 $ 1 $ 個方點 廣義圓方樹長這個樣子 然後就可以用樹形 dp 的方法來解決很多仙人掌上的問題啦 bzoj 4316(求

仙人掌&學習筆記

仙人掌&圓方樹學習筆記 1、仙人掌 圓方樹用來幹啥? ——處理仙人掌的問題。 仙人掌是啥? (圖片來自於\(BZOJ1023\)) ——也就是任意一條邊只會出現在一個環裡面。 當然,如果你的圖片想看起來舒服一點,也可以把圖片變成這樣子 (圖片來源於網路) 2、DFS樹 為啥要寫這個?--因為這個看

仙人掌&學習筆記

https 思維題 bzoj 不變 n) 條件 連通性 普通 一朵 仙人掌&圓方樹學習筆記 1、仙人掌 圓方樹用來幹啥? ——處理仙人掌的問題。 仙人掌是啥? (圖片來自於\(BZOJ1023\)) ——也就是任意一條邊只會出現在一個環裏面。 當然,如果你的圖片想

洛谷4630 BZOJ APIO2018 鐵人兩項 dp (學習筆記

題目連結 題意:給你一個n個點m條邊的無向圖,求所有的能從s到c再到t的三元組個數,其中每個點在一條路徑上至多經過一次。n,m1e5量級。 題解: 首先介紹一下圓方樹。 還記得zyb大佬憑藉圓方樹在APIO拿AU並在SD二輪進隊,近年來圓方樹也成為了一個熱門演算法,於是還是很有必

學習筆記

一直對聯通分量不怎麼了解 先開坑吧 $ tarjan$求割點 首先有一個性質:無向圖的$ dfs$樹沒有橫插邊 搜尋的時候判斷每個孩子能否回到自己上方 若不可行則自己為割點 注意特判根節點:只要自己的不聯通子樹數量$ \geq 2$則一定是割點   $ tarjan

CF487E Tourists + 學習筆記+剖+線段+multiset)

QWQ果然我已經什麼都學不會的人了。 這個題目要求的是圖上所有路徑的點權和!QWQ(我只會樹上啊!) 這個如果是好啊 這時候就需要 圓方樹! 首先在介紹圓方樹之前,我們先來一點簡單的前置知識 首先,我們需要知道什麼是 點雙聯通分量 若一個無向圖中的去掉任意一個節點都不會改變此圖的連通性,即不存

和廣義學習小記

圓方樹,解決毒瘤仙人掌問題的利器。 有了圓方樹,什麼樹上的演算法都可以套在仙人掌上了,比如說點分治、樹鏈剖分、虛樹等等。 OI資料結構無窮無盡,只有你不會的,沒有你想不到的。 資料參見WC2017講稿。 圓方樹: 圓方樹分為圓點和方點。 圓點就是

【模板】靜態仙人掌()

仙人掌圖 getchar size str ++i fin etc pro lock 傳送門 Description 給你一個有\(n\)個點和\(m\)條邊的仙人掌圖,和\(q\)組詢問 每次詢問兩個點\(u,v\),求兩點之間的最短路。 Solution

[學習筆記]

由於 圓點 大堆 分類討論 ace 可能 detail 成了 基本 圓方樹:元芳你怎麽看 圓方樹推薦 圓方樹是什麽? Tarjan家族中,最不好處理的是點雙 因為一個割點可能屬於很多的DCC。 為了把圖縮成一棵樹,我們不得不做出這樣的處理: 摘自:https:

【BZOJ2125】最短路(仙人掌

return namespace tdi ring fine .com HA names truct 【BZOJ2125】最短路(仙人掌,圓方樹) 題面 BZOJ 求仙人掌上兩點間的最短路 題解 終於要構建圓方樹啦 首先構建出圓方樹,因為是仙人掌,和一般圖可以稍微的不一樣

仙人掌&

sdoi uoj problem 仙人掌圖 clas ref zoj .org http 仙人掌&圓方樹 Tags:圖論 占個坑? 咕咕咕 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P43

bzoj4564: [Haoi2016]地圖 仙人掌 莫隊 分塊

bzoj4564: [Haoi2016]地圖 Description 一天rin來到了一個遙遠的都市。這個都市有n個建築,編號從1到n,其中市中心編號為1,這個都市有m條雙向通 行的街道,每條街道連線著兩個建築,其中某些街道首尾相連連線成了一個環。rin通過長時間的走訪,已經清楚

UOJ#23. 【UR #1】跳蚤國王下江南 仙人掌 Tarjan 點雙 點分治 多項式 FFT

原文連結https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 題目傳送門 - UOJ#23 題意   給定一個有 n 個節點的仙人掌(可能有重邊)。   對於所有的 $L(1\leq L\leq n-1)$ ,求出有多少不同的從節點 1 出發的包含 L 條

圖論雜項細節梳理&模板(虛仙人掌,還有。。。)

準備 while class www 哪裏 容易 return mes 模板 虛樹 %自為風月馬前卒巨佬% 用於優化一類樹形DP問題。 當狀態轉移只和樹中的某些關鍵點有關的時候,我們把這些點和它們兩兩之間的LCA弄出來,以點的祖孫關系連成一棵新的樹,這就是虛樹。 容易證明,

《機器學習》第三章 決策學習 筆記加總結

分類問題 子集 觀察 組成 cas 普通 重復 1.0 需要 《機器學習》第三章 決策樹學習 決策樹學習方法搜索一個完整表示的假設空間,從而避免了受限假設空間的不足。決策樹學習的歸納偏置是優越選擇較小的樹。 3.1.簡介 決策樹學習是一種逼近離散值目標函數的方法,在這種方法

學習筆記

記錄 dfs序 ace inf 簡單 http stdio.h include name 虛樹算法其實原理蠻簡單的就是,從一顆n個結點的原樹上在只取出必要結點成一顆新樹,這顆新樹必包含指定m個結點並保持原樹上的祖孫關系。 首先我們來解答一些問題 問:什麽樣的結點是必要的呢?

左偏 學習筆記

img 情況 cin tle ffd cst 合並操作 ble main 左偏樹(Leftist Tree)是一種可並堆的實現。左偏樹是一棵二叉樹,它的節點除了和二叉樹的節點一樣具有左右子樹指針( left, right)外,還有兩個屬性,鍵值和距離(dist)。 鍵值:

主席學習筆記

using 鏈表 自然 bit namespace \n root getch bool Part I 靜態主席樹 定義 主席樹最基礎可以維護區間K大的問題,由於其本質是可持久化線段樹,所以要對線段樹有很深的理解。 栗子:區間第K小 首先這種處理區間的問題肯定要想到區間數據

【BZOJ5329】【SDOI2018】戰略遊戲(,虛

FN 貢獻 地圖 return http top char Go show 【BZOJ5329】【SDOI2018】戰略遊戲(圓方樹,虛樹) 題面 BZOJ 洛谷 Description 省選臨近,放飛自我的小Q無心刷題,於是慫恿小C和他一起頹廢,玩起了一款戰略遊戲。 這款