支配树与Lengauer-Tarjan算法
偽目錄
支配樹是啥
一個(gè)有源點(diǎn)的有向圖,其支配樹是滿足下面條件的一個(gè)有向圖:
對(duì)于支配樹上一點(diǎn),若斷開此點(diǎn),則源點(diǎn)必定不能到達(dá)它的任何兒子,并且能到達(dá)其他任意一個(gè)點(diǎn)。
不顯然的,它是一棵樹(當(dāng)然后面會(huì)有證明)
支配樹有很多實(shí)際用途,我都不知道。
一些性質(zhì)
對(duì)于一個(gè)有向圖,假設(shè)源點(diǎn)為rrr,先從rrr出發(fā)構(gòu)造一棵dfs樹。
定義:對(duì)于一個(gè)點(diǎn)uuu,若一支配uuu的點(diǎn)www滿足w?=uw\not= uw??=u并且www被支配uuu的其他不含uuu的支配點(diǎn)支配,則www就是uuu的最近支配點(diǎn),記作idom(u)idom(u)idom(u)。
通俗的講,www是離uuu最近的那個(gè)支配點(diǎn),并且能恰好支配uuu。
Lemma 1: 支配關(guān)系不存在環(huán)。
Proof: 若aaa支配bbb,那么rrr到bbb必定經(jīng)過aaa,若bbb支配aaa則到達(dá)bbb需要經(jīng)過aaa,此時(shí)并沒有經(jīng)過bbb,產(chǎn)生矛盾。
Lemma 2: 除源點(diǎn)外,其他點(diǎn)有且僅有一個(gè)最近支配點(diǎn)。
Proof: 若aaa支配bbb,bbb支配ccc,則aaa支配ccc;若aaa支配ccc,bbb支配ccc,那么aaa支配bbb或bbb支配aaa,否則可以找到一條路徑不經(jīng)過aaa而到達(dá)ccc而矛盾。因此支配uuu的所有點(diǎn)的集合構(gòu)成了一個(gè)全序關(guān)系,因此總可以找到一個(gè)點(diǎn)滿足上述最近支配點(diǎn)的定義。
Theorem 1: 若連接一個(gè)點(diǎn)和其最近支配點(diǎn),那么這張圖構(gòu)成了一棵樹,并且滿足支配樹的定義。
Proof: 由Lemma 1和Lemma 2可以得到這張圖就是一棵樹。容易證明,若斷開uuu,則源點(diǎn)不可能到達(dá)uuu的任意一個(gè)兒子。對(duì)于其他點(diǎn),由支配樹的定義和Lemma 2可以推導(dǎo)出這個(gè)點(diǎn)不會(huì)受到uuu是否斷開的影響。
由Theorem 1,若得到了所有點(diǎn)的idomidomidom,則容易構(gòu)造出這張圖的支配樹。
那么怎么求idomidomidom呢?
首先定義:定義一個(gè)點(diǎn)uuu的半支配點(diǎn)www為存在路徑w→uw\rightarrow uw→u,使得除了www,這條路徑上任意一個(gè)點(diǎn)的dfs序都大于等于uuu的dfs序,并且www是所有滿足條件的點(diǎn)中最小的那個(gè),記作sdom(u)sdom(u)sdom(u)。
Lemma 3: 對(duì)于任意一點(diǎn)u?=ru\not=ru??=r,idom(u)idom(u)idom(u)為uuu在dfs樹上的祖先。
Proof: 若不是祖先,則可以找到一條只經(jīng)過樹邊的路徑,必定不經(jīng)過idom(u)idom(u)idom(u)。
Lemma 4: 對(duì)于任意一點(diǎn)u?=ru\not=ru??=r,sdom(u)sdom(u)sdom(u)為uuu在dfs樹上的祖先。
Proof: 若不是祖先,若其dfs序小于uuu的dfs序,則dfs時(shí)必定會(huì)經(jīng)過sdom(u)sdom(u)sdom(u)而到達(dá)uuu,此時(shí)sdom(u)sdom(u)sdom(u)就是uuu的祖先,產(chǎn)生矛盾;否則,則可以找到一個(gè)點(diǎn)www為sdom(u)sdom(u)sdom(u)在dfs樹上的祖先,路徑w→sdom(u)→uw\rightarrow sdom(u)\rightarrow uw→sdom(u)→u是一條滿足定義的路徑,并且www的dfs序小于sdom(u)sdom(u)sdom(u)的dfs序,產(chǎn)生矛盾。
Lemma 5: 對(duì)于任意一點(diǎn)u?=ru\not=ru??=r,idom(u)idom(u)idom(u)為sdom(u)sdom(u)sdom(u)在dfs樹上的祖先。
Proof: 若不是祖先,則可以找到一條r→sdom(u)→ur\rightarrow sdom(u)\rightarrow ur→sdom(u)→u的路徑,其中r→sdom(u)r\rightarrow sdom(u)r→sdom(u)經(jīng)過dfs樹邊,顯然不經(jīng)過idom(u)idom(u)idom(u);sdom(u)→usdom(u)\rightarrow usdom(u)→u這段路徑上任意一個(gè)點(diǎn)的dfs序大于uuu,由于Lemma 3,這段路徑也不經(jīng)過idom(u)idom(u)idom(u),因此找到了一條路徑可以繞過idom(u)idom(u)idom(u),產(chǎn)生矛盾。
Lemma 6: 對(duì)于任意兩點(diǎn)u?=r,v?=ru\not=r,v\not=ru??=r,v??=r,若uuu是vvv的祖先,則uuu是idom(v)idom(v)idom(v)的祖先或idom(v)idom(v)idom(v)是idom(u)idom(u)idom(u)的祖先(上面兩種情況都可以相等)。
Proof: 否則idom(u)idom(u)idom(u)是idom(v)idom(v)idom(v)的祖先,idom(v)idom(v)idom(v)是uuu的祖先,那么存在一條路徑能繞過idom(v)idom(v)idom(v)而到達(dá)uuu進(jìn)而到達(dá)vvv,產(chǎn)生矛盾。
Theorem 2: 對(duì)于任意一點(diǎn)u?=ru\not=ru??=r,若sdom(u)→usdom(u)\rightarrow usdom(u)→u只經(jīng)過樹邊的路徑上,不包括sdom(u)sdom(u)sdom(u)的任意一點(diǎn)vvv都滿足sdom(u)sdom(u)sdom(u)是sdom(v)sdom(v)sdom(v)的祖先或二者相等,則idom(u)=sdom(u)idom(u)=sdom(u)idom(u)=sdom(u)。
Proof: 由Lemma 5,若sdom(u)sdom(u)sdom(u)支配uuu,則idom(u)=sdom(u)idom(u)=sdom(u)idom(u)=sdom(u)。對(duì)r→ur\rightarrow ur→u的任意一條路徑,取dfs序最大的點(diǎn)www滿足www是sdom(u)sdom(u)sdom(u)的祖先;取dfs序最小的點(diǎn)xxx,滿足sdom(u)sdom(u)sdom(u)是xxx的祖先或二者相等,容易發(fā)現(xiàn)這樣的點(diǎn)必定存在。那么sdom(x)sdom(x)sdom(x)的就是www,但是www是sdom(u)sdom(u)sdom(u)的祖先,因此x=sdom(u)x=sdom(u)x=sdom(u),那么任何r→ur\rightarrow ur→u的路徑必定經(jīng)過sdom(u)sdom(u)sdom(u),因此sdom(u)sdom(u)sdom(u)支配uuu。
Theorem 3: 對(duì)于任意一點(diǎn)u?=ru\not=ru??=r,若sdom(u)→usdom(u)\rightarrow usdom(u)→u只經(jīng)過樹邊的路徑上,不包括sdom(u)sdom(u)sdom(u)的點(diǎn)中,對(duì)于sdom(v)sdom(v)sdom(v)的dfs序最小的vvv,滿足sdom(v)sdom(v)sdom(v)是sdom(u)sdom(u)sdom(u)的祖先,那么idom(u)=idom(v)idom(u)=idom(v)idom(u)=idom(v)。
Proof: 由Lemma 5和Lemma 6,idom(u)idom(u)idom(u)是idom(v)idom(v)idom(v)的祖先或二者相等。因此只要證明idom(v)idom(v)idom(v)支配uuu即可。類似Theorem 2的證明,取www為idom(v)idom(v)idom(v)的祖先,xxx為idom(v)idom(v)idom(v)的后代或二者相等,那么sdom(x)sdom(x)sdom(x)為www,又由于sdom(v)sdom(v)sdom(v)是最大的,因此xxx不可能是sdom(u)sdom(u)sdom(u)的后代;若xxx是sdom(u)sdom(u)sdom(u)的祖先或相等,但是是idom(v)idom(v)idom(v)的后代,那么就找到了一條繞過idom(v)idom(v)idom(v)而到達(dá)vvv的路徑。因此xxx就是idom(v)idom(v)idom(v)。那么所有路徑都經(jīng)過idom(v)idom(v)idom(v),因此idom(v)idom(v)idom(v)支配uuu。
由Theorem 2和Theorem 3,我們可以輕松的由sdomsdomsdom求出idomidomidom了。
Theorem 4: 對(duì)于任意一點(diǎn)u?=ru\not= ru??=r,sdom(u)sdom(u)sdom(u)是滿足下列條件兩條件的dfs序最小的xxx:1. 存在一條邊x→ux\rightarrow ux→u且xxx的dfs序小于uuu的dfs序;2. x=sdom(v)x=sdom(v)x=sdom(v),vvv的dfs序大于uuu的dfs序,并且存在一個(gè)點(diǎn)www滿足存在一條邊w→uw\rightarrow uw→u且vvv是www的祖先或相等。
Proof: 顯然對(duì)于每一個(gè)xxx,都存在一條滿足sdomsdomsdom要求的路徑。由于sdom(u)sdom(u)sdom(u)后面的點(diǎn)dfs序一定大于等于uuu,取sdom(u)sdom(u)sdom(u)的后面一個(gè)點(diǎn)vvv,那么sdom(v)sdom(v)sdom(v)的dfs序必定等于sdom(u)sdom(u)sdom(u),并且vvv符合上述條件。
由Theorem 4可以很方便的求出sdomsdomsdom。
具體實(shí)現(xiàn)
以dfs序的倒序枚舉每個(gè)點(diǎn),假設(shè)有一個(gè)數(shù)據(jù)結(jié)構(gòu),支持:將一個(gè)點(diǎn)作為另外一個(gè)點(diǎn)的父親;查詢這個(gè)點(diǎn)到根的sdomsdomsdom最小值。
設(shè)當(dāng)前枚舉的點(diǎn)為uuu,可以枚舉uuu的前驅(qū)xxx,那么sdom(u)sdom(u)sdom(u)就是uuu的前驅(qū)在數(shù)據(jù)結(jié)構(gòu)上的sdomsdomsdom最小值的最小值。
對(duì)于uuu的父親ttt,每個(gè)sdom(w)=tsdom(w)=tsdom(w)=t并且www是uuu的后代或二者相等的www在數(shù)據(jù)結(jié)構(gòu)上的sdomsdomsdom最小值就是Theorem 2和Theorem 3描述的最小值,直接更新www的idomidomidom即可。
注意Theorem 3中vvv的idomidomidom可能還沒有被更新,那么暫時(shí)令idom(w)=vidom(w)=vidom(w)=v,之后若idom(w)?=sdom(w)idom(w)\not=sdom(w)idom(w)??=sdom(w)就更新成idom(idom(w))idom(idom(w))idom(idom(w))。
數(shù)據(jù)結(jié)構(gòu)可以采用帶權(quán)并查集,時(shí)間復(fù)雜度O(nlog?n)O(n\log n)O(nlogn)
代碼
//dfn[i]為i的dfs序,idfn[i]是dfs序?yàn)閕的點(diǎn),het[i]是i的所有前驅(qū),bkt[i]是所有sdom為i的點(diǎn) //eval(i)為找到并查集中這個(gè)點(diǎn)到父親的sdom中dfs序最小的那個(gè) int getidom() {for(int i=cnt; i>1; --i){int u=idfn[i];for(int v:het[u]){if(!dfn[v]){continue;}int w=eval(v);if(dfn[sdom[w]]<dfn[sdom[u]]){sdom[u]=sdom[w];}}bkt[sdom[u]].push_back(u);int t=fa[u];dsu::fa[u]=t;for(int v:bkt[t]){int w=eval(v);idom[v]=(sdom[w]==sdom[v])?t:w;}bkt[t].clear();}for(int i=2; i<=cnt; ++i){int u=idfn[i];idom[u]=(idom[u]==sdom[u])?(idom[u]):(idom[idom[u]]);}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Canopus-wym/p/10376054.html
總結(jié)
以上是生活随笔為你收集整理的支配树与Lengauer-Tarjan算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql查姓名中既有a也有e的姓_my
- 下一篇: 服务器摆放需要预留U位么_让客厅大一倍的