tarjan學習筆記

wuhupai發表於2024-04-21

在 Tarjan 演算法中為每個結點u維護了以下幾個變數:
dfn[u]:深度優先搜尋遍歷時結點u被搜尋的次序。
low[u]:設以u為根的子樹為Subtree(u)。 low[u]定義為以下結點的dfn的最小值:
Subtree(u)中的結點;
從Subtree(u)透過一條不在搜尋樹上的邊能到達的結點。

如何計算low?
首先讓low[x]=dfn[x](根據定義,最大也不過是dfn[x])
若在搜尋樹上x是y的父節點,則low[x]=min(low[x],low[y]) 遞迴求解
若無向邊(x,y)不是搜尋樹上的邊,則low[x]=min(low[x],dfn[y])

性質:
一個結點的子樹內結點的 dfn 都大於該結點的 dfn。
從根開始的一條路徑上的 dfn 嚴格遞增,low 嚴格非降。

感性理解:low[x]就是從以x為根的搜尋樹子樹內能到達的最小dfn

割邊/割點

無向邊(x,y)是橋(割邊),當且僅當搜尋樹上存在x的一個子節點y,滿足:dfn[x]<low[y]
感性理解:就是從y出發,一直在y的子樹裡轉,因為y子樹裡的dfn都比x大

點x為割點,當且僅當存在一個點y,dfn[x]<=low[y]
感性理解:就是從y出發,一直在x的子樹裡轉,因為x子樹裡的dfn都大於等於x

相關文章