滅絕樹學習小記

2022-04-30 06:18:09 字數 1920 閱讀 1060

tags:圖論

聽這名字特別酷對吧

不像乙個noip滾粗選手能學的東西

所以只能當乙個搬運工了

orzlitble

滅絕樹和支配樹應該是一種東西

用於\(o((n+m)logn)\)或者\(o((n+m)\alpha)\)求解一類如下問題:

在一張捕食圖上(從捕食者向**食者有連邊),若某生物的所有食物都滅絕了,則該生物滅絕。

滅絕樹便是此圖的一種生成樹,使得滿足滅絕樹上某點滅絕,該點子樹內所有點都滅絕

把圖分成以下幾種情況考慮

本身就是自己的滅絕樹

分以下幾步

找lca用倍增實現即可

例題:hdu4694 important sisters:求一般圖每個點支配樹上的祖先編號之和

\(orz\ tarjan\)

首先把原圖\(dfs\)一遍,求出\(dfn\)序

官方定義:\(semi[x]=min\\),\(min\)指\(dfn\)最小

通俗一點:從\(semi[x]\)到\(x\)的路徑,掐頭去尾,都走的\(dfn\)大於\(x\)的點

畫個圖大概就是如下,\(dfn=\\),\(2->6->5\)掐頭去尾的\(dfn\)都大於\(dfn[5]\)

重要性質:

以下祖先關係均指\(dfs\)樹的祖先關係

**地理解就是:\(semi[x]\)到\(x\)的路徑相當於是在\(dfs\)樹外有一條路,且\(semi[x]\)是離根最近的那個點,從\(semi[x]\)都走不到\(x\)了,那其他的點更走不到了

由此可以得出一種做法,求出\(semi\)後轉dag的做法,複雜度\(o(nlogn)\)

十分的巧妙

按照\(dfn\)序從大到小做,對於\(x\),列舉\(r\)存在\(r->x\)這條邊

for(int w=n;w>=2;w--)

a[n<<1];

int head[n],cnt;

void reset()

void link(int x,int y) ;head[x]=cnt;}

}a,ra,b,c;

void reset()

}void dfs(int x,int fr)

void dfscalc(int x,int fr)

int find(int x)

void work()

{ dfs(n,0);

for(int w=n;w>=2;w--)

{ int x=id[w],res=n;

if(!x) continue;

for(int i=ra.head[x];i;i=ra.a[i].next)

{ int r=ra.a[i].to;

if(!dfn[r]) continue;

if(dfn[r]性質

\(idom[x]\)表示\(x\)的支配點(滅絕樹/支配樹上的父親)

可以這樣**地理解:如果\(x\)是祖先,那麼\(x\)的食物**(指向\(x\)的邊)就少,相對來說滅絕掉\(x\)更容易,那麼\(idom[x]\)會相應地靠近\(x\),同理\(y\)什麼都吃所以誇張地說就是要把草給滅絕了\(y\)才會滅絕

然後看不懂了。。真的不可理解了。。而且發現上邊一般圖的做法我並不一定理解到位

丟個鏈結甩鍋吧

應該很少會有這種毒瘤玩意,記得$o(nlogn)$的做法就好了,畢竟路徑壓縮並查集是可以被卡成$o(nlogn)$的:

支配樹(滅絕樹) 學習筆記

在飛機上的時候理解了一下這個演算法,這裡寫一下吧。本來以前一直以為是個 h 2o 演算法 其實也是 結果發現一些證明還是很有意思的。對於乙個給定圖,我們有如下定義 我們稱 u 為 v 的支配點當且僅當在原圖中刪去 u 之後從根節點出發無法抵達 v 我們稱 u 為 v 的半支配點當且僅當 u 存在一條...

回文樹學習小記

回文樹,顧名思義,用回文串構成的一棵樹,結合了一點ac自動機的思想,打起來不長,用起來挺方便。變數 首先滿足ac自動機的結構。定義集合tree fail 指向該節點表示的回文串最長回文字尾在樹中的節點,如abbba就是ababbabbba的最長回文字尾 son 26 表示在當前節點表示的回文串兩邊都...

伸展樹splay學習小記

splay是基本操作,rotate是splay的基本操作。splay now,root 把now splay到root的下面。單旋和雙旋就不說了。我們可以簡化操作,如果是一字型 方向相同 則先旋father,否則先旋now。然後再旋now。rotate now是指將now繞father rotate...