關於Tarjan演算法中用dfn不能用low的問題

2022-09-04 16:12:28 字數 926 閱讀 4633

在tarjan演算法中對於dfn[v] != 0的情況,low[u] = min(low[u], dfn[v]) ❶

而如果錯寫為low[u] = min(low[u], low[v]) ❷,可能導致答案錯誤

寫成❷式可能導致low[u]算錯,但一般不會影響最終答案(無向圖的邊雙連通分量e-dcc似乎也是如此)

例如如下資料,就會導致low[u]的錯誤

5 6

1 22 3

3 43 1

4 5

5 3

注意這裡到達3號點後先走向了1號點更新low[3],再走向4號點;如果先走向4號點,low[3]依然為3,此時low[4],low[5]就依然是3,例如將資料中「3 4」和「3 1」邊的位置交換(這裡用head鄰接表存圖,故後加入的邊先遍歷)

5 6 

1 22 3

3 13 4

4 55 3

寫成❷式可能導致low[u]算錯,而且一般會使割點找的不正確,導致錯誤答案

例如如下資料,就會導致low[u]的錯誤

同樣注意這裡到達3號點後先走向了1號點更新low[3],再走向4號點;如果先走向4號點,low[3]依然為3,此時low[4],low[5]就依然是3,3號點也會被正確判斷成割點。例如換成如下資料(這裡用head鄰接表存圖,故後加入的邊先遍歷)

5 6

2 33 1

3 45 3

1 24 5

關於LCA的離線演算法 Tarjan

利用並查集優越的時空複雜度,我們可以實現lca問題的o n q 演算法,這裡q表示詢問 的次數。tarjan演算法基於深度優先搜尋的框架,對於新搜尋到的乙個結點,首先建立由這個結點 構成的集合,再對當前結點的每乙個子樹進行搜尋,每搜尋完一棵子樹,則可確定子樹 內的lca詢問都已解決。其他的lca詢問...

關於tarjan演算法的空間優化

最近隨著對tarjan演算法理解的加深,我發現用另外一種途徑實現tarjan的方法,且可以省去dfn陣列,大大節省了空間。經過大量測試,已經無誤。以下將分階段闡述進行優化的過程。第一階段 下面來說一下我做出此優化的思路。設任意兩個節點為u,v。縱觀整個tarjan演算法,我們發現,dfn陣列被呼叫的...

tarjan演算法詳解

參考 tarjan演算法在強連通分量分離中運用很廣,書寫簡單,並且可以拓展到圖的割點,割邊上,十分強大 具體思路 令dfn u 表示當前點的時間戳 low u 表示當前點所能到達的點的時間戳中最小的乙個 到達點u時,將其入棧 拓展點u後代 當且僅當dfn u low u 時,棧頂元素全部出棧,此時出...