如何用Python寫Tarjan演算法?
Tarjan演算法是一種基於深度優先搜尋(DFS)的圖演算法,用於求解強連通分量(SCC)問題。本文將介紹如何以Python編寫Tarjan演算法,並附上具體的程式碼範例。
Tarjan演算法的基本概念是透過DFS遍歷圖中的節點,同時記錄每個節點的遍歷序號和最小可達序號。在遍歷的過程中,如果存在當前節點能到達的序號更小的節點,則將其加入到一個臨時的棧中,並在遍歷結束後,判斷棧頂節點是否為一強連通分量的根節點。如果是,則將堆疊中的節點出棧,並將它們加入結果清單。
以下是使用Python編寫Tarjan演算法的程式碼範例:
def tarjan(graph): n = len(graph) index = [0] * n low_link = [0] * n on_stack = [False] * n stack = [] result = [] index_counter = 0 def dfs(v): nonlocal index_counter index[v] = index_counter low_link[v] = index_counter index_counter += 1 stack.append(v) on_stack[v] = True for w in graph[v]: if index[w] == -1: dfs(w) low_link[v] = min(low_link[v], low_link[w]) elif on_stack[w]: low_link[v] = min(low_link[v], index[w]) if low_link[v] == index[v]: scc = [] while True: w = stack.pop() on_stack[w] = False scc.append(w) if w == v: break result.append(scc) for v in range(n): if index[v] == -1: dfs(v) return result
在上述程式碼中,使用了一個二維列表graph
來表示圖的鄰接關係。 graph[i]
表示頂點i
所能到達的頂點集合。演算法透過迭代遍歷每個頂點,如果某個頂點未被訪問過,則呼叫DFS函數進行搜尋。 DFS函數採用了遞歸的方式,實作了Tarjan演算法的核心邏輯。
在使用Tarjan演算法時,只需將圖的鄰接關係轉換為二維列表graph
,然後呼叫tarjan(graph)
即可傳回強連通分量的列表。
總結:
本文介紹如何用Python寫Tarjan演算法,並附上了具體的程式碼範例。透過理解Tarjan演算法的基本思想,我們可以更好地應用這項演算法來解決強連通分量問題。希望本文能對讀者理解和使用Tarjan演算法提供協助。
以上是如何用Python寫Tarjan演算法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!