1. 程式人生 > >感性理解支配樹

感性理解支配樹

前言

orz一下這位大神

本文獻給想要性感地理解支配樹的同學,如果你想更性感一點,所有證明均可跳過。

litble特別菜,有錯誤請指出,謝謝。

支配點

很久很久以前,有一張有向圖,有向圖有一個起點 S S ,有一個叫小X的強盜,佔據一個點攔路打劫。當小X佔據了 x

x 點後,若從 S S 出發就到不了 y y 點了,那麼 x
x
就是 y y 的支配點。

而支配樹,就是滿足樹上一個點 x x 的所有祖先都是它的支配點的樹。

How to build 支配樹

以下我們假定從 S

S 出發可以到達圖上所有點。

樹形圖

顯然,樹形圖自己就是自己的支配樹。

DAG

DAG的話,我們按照拓撲序從小到大進行,假設處理到點 x x ,則查一遍所有可達點 x x 的點 y y ,所有點 y y 一定被加入了支配樹中,那麼它們在支配樹上的LCA就是 x x 在支配樹上的父親。

倍增就可以做到 O ( n log n ) O(n \log n) ,例題洛谷P2597,程式碼如下:

#include<bits/stdc++.h>
using namespace std;
#define RI register int
int read() {
	int q=0;char ch=' ';
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') q=q*10+ch-'0',ch=getchar();
	return q;
}
const int N=65540;
int n,top,js;
int f[N][16],du[N],p[N],st[N],ans[N],dep[N];
vector<int> g[N],rg[N],tr[N];
void topsort() {
	for(RI i=1;i<=n;++i)
		if(!du[i]) g[0].push_back(i),rg[i].push_back(0),++du[i];
	top=1,st[top]=0;
	while(top) {
		int x=st[top];p[++js]=x,--top;
		for(RI i=0;i<g[x].size();++i) {
			--du[g[x][i]];
			if(!du[g[x][i]]) st[++top]=g[x][i];
		}
	}
}
int lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	for(RI i=15;i>=0;--i) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(RI i=15;i>=0;--i) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
void dfs(int x) {
	ans[x]=1;
	for(RI i=0;i<tr[x].size();++i)
		dfs(tr[x][i]),ans[x]+=ans[tr[x][i]];
}
int main()
{
	n=read();
	for(RI i=1;i<=n;++i) {
		int x=read();
		while(x) g[x].push_back(i),rg[i].push_back(x),++du[i],x=read();
	}
	topsort();
	for(RI i=2;i<=n+1;++i) {
		int x=p[i],y=rg[x][0];
		for(RI j=1;j<rg[x].size();++j) y=lca(y,rg[x][j]);
		tr[y].push_back(x),dep[x]=dep[y]+1,f[x][0]=y;
		for(RI j=1;j<=15;++j) f[x][j]=f[f[x][j-1]][j-1];
	}
	dfs(0);
	for(RI i=1;i<=n;++i) printf("%d\n",ans[i]-1);
    return 0;
}

一般有向圖

一般有向圖有一個優秀的做法叫做Lengauer Tarjan,對,又是Tarjan,Tarjan tql。

首先,我們從 S S 開始dfs整張圖,可以提取出一棵dfs樹,並且 x x 的dfs序是 d f n ( x ) dfn(x)

半支配點

假設存在一個點 y y ,從 y y 出發有一條到 x x 的路徑,並且路徑上任何一點 z z (不包括 x x y y )都滿足 d f n ( z ) &gt; d f n ( x ) dfn(z)&gt;dfn(x) ,則稱 y y x x 半支配點

s e m i ( x ) semi(x) x x 的dfn最小的半支配點,因為 x x 在dfs樹上的父親也是它的一個半支配點,所以 s e m i ( x ) semi(x) 一定是 x x 的祖先。

我們為什麼需要這個 s e m i semi 呢?因為我們刪掉原圖中的非樹邊後,連邊 ( s e m i ( x ) , x ) (semi(x),x) ,不改變原圖中的支配點關係。性感的證明如下:

  1. 假如在原圖上刪掉 y y x x 就不可達了,那麼顯然 y y x x 在dfs樹上的祖先。
  2. 假若從 y y 的某個祖先出發,可以在不經過 y y 的情況下,走到一個 d f n ( y ) &lt; d f n ( z ) d f n ( x ) dfn(y) &lt; dfn(z) \leq dfn(x) 的點 z z y y 就是 x x 的支配點,反之不是。
  3. 因為不能經過 y y ,所以從這個祖先走到 z z 的路徑上經過的所有點的 d f n dfn 應該大於 y y
  4. 假如這條路徑上的所有點的 d f n dfn 都大於 z z ,則顯然通過 ( s e m i ( z ) , z ) (semi(z),z) 可以保證新圖上這個點依然能到 z z 。否則,這條路徑要麼經過一個 d f n dfn 小於等於 x x 大於 y y 的點(直接滿足條件),要麼全部經過 d f n dfn 大於 x x 的點(也就是 x x 的半支配點)
  5. 所以,新圖中的支配點關係與原圖相同。

如果求出了 s e m i semi ,我們就把原圖變成了一個DAG,然後就可以重複DAG的做法啦。不過更優的做法也是有的。

求半支配點

對於一個點 x x ,我們找到所有邊 ( y , x ) (y,x) 對應的 y y

d f n ( y ) &lt; d f n ( x ) dfn(y)&lt;dfn(x)

相關推薦

感性理解支配

前言 orz一下這位大神。 本文獻給想要性感地理解支配樹的同學,如果你想更性感一點,所有證明均可跳過。 litble特別菜,有錯誤請指出,謝謝。 支配點 很久很久以前,有一張有向圖,有向圖有一個起點

支配

mes pri amp col ring -s number clu += 求sdom sdom[u]=fa[u] dfn[v]>dfn[u] 即(v->u)為橫插邊或反組邊 則有sdom[u]=Min(sdom[u],sdom[x]),x為v到根的路徑

菜雞KKK在12.28 匡哥的引領下 理解鏈剖分

span 連續 gpo 屬於 樹鏈剖分 最短路 數據 會有 什麽 樹鏈剖分___步驟 一.按照dfs序 將點重新標號.   首先,我們要理解,為什麽一定要按dfs序來標號,因為,樹鏈剖分要操作的是一棵樹上,改變兩個點之間最小路上邊的數據,主要是因為,每一條找到的最短路,他們

關於電感飽和的感性理解

影響 表示 就會 效果 開始 部分 一個 其中 就是   在研究電感濾波時,經常糾結電感的選型,脫離學校有點久了,把之前關於電感的那點知識都丟了,以至於沒想明白為什麽電感會飽和,而導致電感飽和的恰恰是我想要保留的直流電流,把電感和電容的概念完全等同了,以為直流電流對電感毫無

[CF757F] Team Rocket Rises Again [最短路][支配]

[KaTeX parse error: Expected 'EOF', got '\fark' at position 1: \̲f̲a̲r̲k̲{Link}] 題意:給一 n

關於SG函式的一些淺顯的感性理解

有向圖博弈。給定一個有向圖,一個起點,起點上有一個棋子,兩個玩家輪流推動棋子,誰不能推了誰就輸了。希望知道某個點為起始是必勝還是必敗。 注:這兩個人都十分聰明,可以看透未來(?)。 一點分析: 1.顯然這要是個DAG,不然遊戲就不能結束了。。(廢話)  而且兩個人要在同

HDU.4694.Important Sisters(支配)

HDU \(Description\) 給定一張簡單有向圖,起點為\(n\)。對每個點求其支配點的編號和。 \(n\leq 50000\)。 \(Solution\) 支配樹。 還是有點小懵逼。 不管了,說不定會講,反正以後再說。 https://blog.csdn.net/litble/arti

支配學習日誌

支配樹 學習日誌 給定一張有向圖 $G=(V, E)$,其中 $\lvert V \rvert=n, \lvert E \rvert=m$,以及根 $r \in V$。 我們稱頂點 $x\ (x \ne r)$ 可達,當且僅當存在一條從 $r$ 到 $x$ 的路徑。 對於 $x \ne r$

通俗理解決策演算法中資訊增益的

通俗理解決策樹演算法中的資訊增益 在決策樹演算法的學習過程中,資訊增益是特徵選擇的一個重要指標,它定義為一個特徵能夠為分類系統帶來多少資訊,帶來的資訊越多,說明該特徵越重要,相應的資訊增益也就越大。 1、概念 我們前面說了,資訊熵是代表隨機變數的複雜度(不確定度)通

[BZOJ2815][ZJOI2012]災難(拓撲排序/支配)

支配樹目前只見到這一個應用,那就不獨分一類,直接作為拓撲排序題好了。 每個點向所有食物連邊,定義fa[x]為x的支配點,即離x最近的點,滿足若fa[x]滅絕,則x也要滅絕。 這樣,將fa[x]向x連邊,則建出的新圖是一棵樹,這就是支配樹(不是嚴謹的支配樹,被出題人稱為滅絕樹) 建樹流程是,將拓撲序反向,

感性理解深搜和剪枝

感性理解深搜和剪枝 上網看了一些部落格,感覺寫的不太清楚,這裡我清晰的來總結一下。 目錄(擺脫書籍,輕鬆理解) 感性理解深搜和剪枝 首先剪枝:           1.什麼是“剪枝”    

深入理解B和B+(二)B+的優點

有了B樹,為什麼還需要B+樹呢?那就要先說下B樹的缺點了,人類對於效能的追求是無止境的,B樹相比二叉樹雖好,但還是存在以下問題:       1.每個節點中既要存索引資訊,又要存其對應的資料,如果資料很

深入理解B和B+(一)B的優點和插入刪除過程

B樹也就是B-樹,一個m階的B樹滿足以下條件:      1.每個節點最多有m個子樹。      2.當有子樹時,根節點至少擁有兩個子樹。      3.除了根節點外,每個分支節點至少擁有m/2棵子樹。

【轉】深入淺出理解決策演算法(二)-ID3演算法與C4.5演算法

從深入淺出理解決策樹演算法(一)-核心思想 - 知乎專欄文章中,我們已經知道了決策樹最基本也是最核心的思想。那就是其實決策樹就是可以看做一個if-then規則的集合。我們從決策樹的根結點到每一個都葉結點構建一條規則。 並且我們將要預測的例項都可以被一條路徑或者一條規則所覆蓋。 如下例:假設我

【轉】深入淺出理解決策演算法(一)-核心思想

演算法思想 決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。 其每個非葉節點表示一個特徵屬性上的測試,每個分支代表這個特徵屬性在某個值域上的輸出,而每個葉節點存放一個類別。 使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特徵屬性,並按照其值選擇

重溫資料結構:理解 B 、B+ 特點及使用場景

讀完本文你將瞭解: 大家好,前面那篇文章《3 分鐘理解完全二叉樹、平衡二叉樹、二叉查詢樹》中我們瞭解了幾種特殊的二叉樹的功能及特點,知道了它們在進行查詢資料時可以提高效率,但需要注意的是,這是指在記憶體中進行查詢。如果有海量的資料,不可能一次性讀取到

資訊熵知乎解釋,感覺很好,幫助理解決策演算法

讓我們說人話!好的數學概念都應該是通俗易懂的。 資訊熵,資訊熵,怎麼看怎麼覺得這個“熵”字不順眼,那就先不看。我們起碼知道這個概念跟資訊有關係。而它又是個數學模型裡面的概念,一般而言是可以量化的。所以,第一個問題來了:資訊是不是可以量化? 起碼直覺上而言是可以的,不然怎麼可能我們覺得有些人說的廢話特別多,“

感性理解遞迴搜尋(dfs)

遞迴絕對是我最最最討厭的東西,沒有之一,所以我現在是懷著百感交集的心情在寫這篇部落格,然而最糾結的是我現在無從下手。 為了表示歉意,我也不知道從哪裡開始,就想到什麼些什麼吧 第一步:理解遞迴搜尋的概念 遞迴搜尋是一個麻煩又複雜的東西,但是卻是一個不得不學懂的演算法

LG5180[模板]支配【Lengauer-Tarjan算法】

不改變 直接 算法 進行 org http 尋找 www pro LG5180[模板]支配樹【Lengauer-Tarjan算法】 轉載自https://www.luogu.org/problemnew/solution/P5180 來一個$Tarjan$老爺子的$Leng

如何理解裝置中address-cells和size-cells

最近剛剛解除裝置樹,對address-cells和size-cells的含義表示很不解,網上找到諸如下面的描述(總感覺不拗口了,而且很難理解):#address-cells = <1>;基地