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