集訓太棒了
首先,強連通分量的定義:
有向圖內,乙個強連通分量內任一點之間都存在至少一條路徑。
直觀一點?
乙個點集,在有向圖上它們構成了乙個環(個人理解但的確是這樣)
一些定義:
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一遍,或者只需要...