支配樹 Dominator Tree 學習筆記

2021-08-13 15:33:39 字數 3364 閱讀 1951

因為是學習筆記所以是邊學邊寫,以防自己到時候忘掉了=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上的支配樹

作用 在有向圖中,當詢問從起點到終點的路徑必須經過的點,即去掉這個點以及周圍的邊,就不能從起點到達終點的點 類似於無向圖中的割點 這時,可與通過建立支配樹來解決問題。結構 支配樹理所當然是乙個樹狀結構。圖的起點作為根節點,每乙個節點到達根節點的路徑都是必經點。如果能建立這樣的樹狀結構,那麼基本可以通...