因為是學習筆記所以是邊學邊寫,以防自己到時候忘掉了=w=
首先,支配樹是一棵樹(廢話),用來求解必經點問題。
即求乙個有向圖中以r為根到達每乙個點的必經點。
樹中每乙個點x的父親為idom(x),表示x的最近必經點。
我們把從r到x必經y稱作「y支配x」,顯然支配是具有傳遞性的。
所以可以證明idom是唯一的。
首先對原圖g建出其的dfs樹t並且按dfs序重標號,那麼就具有一些性質:
1:橫叉邊必然從大指向小
這就表明對於任意兩點u,v,u<=v,u到v中的任意路徑都經過u,v在t中的乙個公共祖先
2:idom(x)必為x在t中的祖先
廢話定義半必經點sdom(x),表示最小的v,使得存在一條從v到x的路徑不經過任何樹邊。
3:sdom(x)必為x在t中的祖先
因為sdom(x)<=x,根據性質1可知sdom(x)到x的那條路徑必然經過x和sdom(x)的乙個公共祖先。而這個公共祖先就是sdom(x)。如果不是就證明sdom(x)是通過橫叉邊走到x的祖先中,這顯然是不合法的。
4:idom(x)必為sdom(x)在t中的祖先
二者都是x的祖先,並且idom(x)不可能為sdom(x)的後代,否則將被完全跳過。
5:如果v是x的祖先,那麼v是idom(x)的祖先或者idom(x)是idom(v)的祖先。
如果v是idom(x)的後代,並且idom(v)是idom(x)的祖先,那麼就可以從r繞過idom(x)走到v,再直接走到x,與已知矛盾。
接下來講如何求sdom(x)
先給出結論,對於x的乙個前繼y,若y < x,sdom(x)=min(y)
否則sdom(x)=min(sdom(z)),z是y的祖先且z > x
證明:設右邊的數為v,先證明sdom(x)<=v,再證明sdom(x)>=v
1」,對於第一種顯然成立
第二種,存在一條從sdom(z)到z到y到x的路徑
其中sdom(z)到z這一段除頭尾均》z,即》x
後一段顯然
所以證明了sdom(x)<=v
2」如果sdom(x)只經過一條邊,必有sdom(x)>=v,因為v<=min(y),y是x的前繼
否則我們設路徑v0=sdom(x),v1,v2,v3…vk=x,vj是首個滿足vj是vk-1的父親的。
可以證明v1…vj-1>vj,否則我們取最小的vi滿足vi < vj,必然滿足vi到vj的路徑上經過vi和vj的乙個祖先,設為w,可以通過類似性質3的證明發現w就是vi,那麼vi是vj的祖先,也就是vi是vk-1的祖先,與假設矛盾。
這其實就是構造了乙個集合滿足第二種條件,vj相當於z,於是sdom(x)=sdom(vj)>=v,因為我們的路徑是任取的,並且對於所有的路徑都滿足條件。
綜上sdom(x)=v
說了這麼多我們就是要用sdom來求idom
其實我們發現如果我們將所有的邊
刪去,然後將所有的
加上,我們會發現每個點的idom並不會改變,於是我們直接用log的dag做法就好了。
具體來說idom(x)=lca(idom(y)),y是x的前繼。
但是tarjan提出了乙個叫做lengauer-tarjan的利用並查集達到o(nα(n))的做法
讓我們再來講幾個用sdom求idom的定理:
1:若所有在sdom(x)到x的路徑上的點y,y!=sdom(x)都滿足sdom(y)>=sdom(x)則idom(x)=sdom(x)
證明:對於任意一條r到x的路徑,設點z為最後乙個小於sdom(x)的點。
若沒有則顯然sdom(x)支配x
設w為路徑上z之後首個在sdom(x)到x路徑上的點(不含端點)
類似sdom的證明,路徑上z到w的點vi>w
所以sdom(w)<=z < sdom(x)
又因為條件知道sdom(w)>=sdom(x),所以w不能是sdom(x)的後代,與假設矛盾。
2:令u是sdom(x)到x的路徑上的sdom(u)最小的點,u!=sdom(x)
則idom(x)=idom(u)
證明:類似上乙個的證明形式,取最後乙個點z滿足z < idom(u)
再取第乙個y滿足y在idom(u)到x的路徑上。
同理可得sdom(y)<=z,那麼我們知道sdom(y)<=z < idom(u)<=sdom(u)<=sdom(x) < u<=x
現在我們來嘗試確定y的位置。
首先y一定不在sdom(x)到x的路徑上,如果在就違反了sdom(u)最小
其次y一定不再idom(u)到sdom(x)的路徑上,如果在我們就存在一條從r到sdom(y)到y避開idom(u)到u的路徑。
這樣就說明了y=idom(u),即idom(u)支配x
也就是說,我們取從sdom(x)到x路徑上sdom(u)最小的u,如果u=x,那麼idom(x)=sdom(x),否則idom(x)=idom(u)
首先考慮求sdom的做法,我們只需要求出對於點x所有大於他的祖先。
考慮按dfs序倒序處理,用帶權並查集維護,很容易處理出sdom最小的那個點。
對於idom來說,我們每處理完乙個點的sdom,就把它掛在sdom處。
然後處理所有掛在它父親處的點v,求出點v到r路徑上目前sdom最小的點設為u。
如果sdom(u) < sdom(v),說明此時v不滿足第一種情況,但是u是對於v來說第二種情況的候選點,並且由於我們是倒序列舉u一定當前最小,我們直接把idom(v)設為u。
否則idom(v)=fa(x),這是由於第一種情況。
當我們做完之後會發現第二種情況我們的idom實際上求的是候選點而不是idom
所以再掃一遍把所有的idom求出來即可。
例題:hdu 4694 important sisters
typedef
vector
vec;
#define pb(a) push_back(a)
vec pre[n],dom[n];
int lst[n],nxt[n<<1],t[n<<1],l;
void add(int x,int y)
int n,m,x,y,semi[n],idom[n];
int id[n],dfn[n],fa[n],tot;
void dfs(int x)
}}int father[n],val[n];
int get(int x)
int smin(int x,int y)
father[x]=fa[x];dom[semi[x]].pb(x);
if (!dom[fa[x]].empty())
fo(j,0,dom[fa[x]].size()-1)
}
支配樹(滅絕樹) 學習筆記
在飛機上的時候理解了一下這個演算法,這裡寫一下吧。本來以前一直以為是個 h 2o 演算法 其實也是 結果發現一些證明還是很有意思的。對於乙個給定圖,我們有如下定義 我們稱 u 為 v 的支配點當且僅當在原圖中刪去 u 之後從根節點出發無法抵達 v 我們稱 u 為 v 的半支配點當且僅當 u 存在一條...
樹的最小支配集
最小支配集,就是圖中用最少的點覆蓋其它所有點 如果用選a點覆蓋,則與a點相連的點都被覆蓋,大致 就是這樣 有乙個圖g,現在希望在一些點建立控制站,每個控制站能控制與它相臨的點 直接相連 現在希望有選擇的在一些點建立控制站,使得以最小得控制站數,控制所有的點 圖的最小支配集是np 問題,我只會樹的最小...
學習記錄 DAG上的支配樹
作用 在有向圖中,當詢問從起點到終點的路徑必須經過的點,即去掉這個點以及周圍的邊,就不能從起點到達終點的點 類似於無向圖中的割點 這時,可與通過建立支配樹來解決問題。結構 支配樹理所當然是乙個樹狀結構。圖的起點作為根節點,每乙個節點到達根節點的路徑都是必經點。如果能建立這樣的樹狀結構,那麼基本可以通...