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...