Tarjan學習筆記

2022-05-27 22:33:26 字數 1239 閱讀 7775

集訓太棒了

首先,強連通分量的定義:

有向圖內,乙個強連通分量內任一點之間都存在至少一條路徑。

直觀一點?

乙個點集,在有向圖上它們構成了乙個環(個人理解但的確是這樣)

一些定義:

dfn(u)是節點u的時間戳,表示點u是第幾個被訪問的節點。

low(u)是u或u的子樹能夠追溯到的最早的棧中節點的時間戳。

當dfn(u)=low(u)時,以u為根的搜尋子樹上所有節點(從棧頂到u的所有節點)是乙個強連通分量。

low陣列的計算方法: 如果x→y是正向邊(連線到不在棧中節點的邊),

y是x的子樹,所以y最早能去哪x最早就能去哪

那麼 low[x]=min(low[x],low[y])

如果x→y是反向邊(連線到已在棧中節點的邊),這時候我們發現構成環了

那麼 low[x]=min(low[x],dfn[y])

如果x→y是交叉邊(連線到已經出棧的節點的邊),

什麼也不幹

不理解?

反向邊

}if(dfn[rt]==low[rt])

while(k!=rt);}}

學習筆記 tarjan

有向圖dfs生成樹有且僅有一下四類邊 如果結點 u 是極大強連通子圖 g 在dfs搜尋樹上第乙個搜到的結點,那麼 g 的其他節點一定在以 u 為根的子樹中,我們稱結點 u 為強連通分量 g 的根.簡單證明一下上面這個結論,考慮反證法.若 u 的子樹的結點集合為 t 假設 exist v in g v...

Tarjan 學習筆記 LCA

常用的求 lca 的演算法有 ta rjan df s st 倍增o logn o nlog n 之間。ta rjan 是 離線 演算法。顧名思義,就是在一次遍歷中把所有詢問一次性解決,所以其時間複雜度是 o n q 利用了 df s 和並查集的思想,祖先回溯記錄為上乙個,如果已經某一點遍歷過了就 ...

學習筆記 割點 tarjan

給出乙個n個點,m條邊的無向圖,求圖的割點。那麼割點是什麼呢,就是說,如果你去掉了這個點和所有與這個點相連的邊之後,整張圖的連通塊數量增加了,這個點就是乙個割點 怎麼做呢,每次列舉乙個點,dfs一遍,看有沒有增加連通塊,好像是n方,n有2w那麼大,會炸啊 運用這個演算法,可以只dfs一遍,或者只需要...