Tarjan 알고리즘을 Python으로 작성하는 방법은 무엇입니까?
Tarjan 알고리즘은 SCC(강하게 연결된 구성 요소) 문제를 해결하는 데 사용되는 깊이 우선 검색(DFS) 기반 그래프 알고리즘입니다. 이 기사에서는 구체적인 코드 예제와 함께 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
위 코드에서는 2차원 목록 그래프
를 사용하여 그래프의 인접 관계를 표현합니다. graph[i]
는 정점 i
가 도달할 수 있는 정점 집합을 나타냅니다. 알고리즘은 각 정점을 반복적으로 순회하며 정점을 방문하지 않은 경우 DFS 함수를 호출하여 검색합니다. DFS 기능은 재귀적 방법을 사용하여 Tarjan 알고리즘의 핵심 논리를 구현합니다. graph
来表示图的邻接关系。graph[i]
表示顶点i
所能到达的顶点集合。算法通过迭代遍历每个顶点,如果某个顶点未被访问过,则调用DFS函数进行搜索。DFS函数采用了递归的方式,实现了Tarjan算法的核心逻辑。
在使用Tarjan算法时,只需将图的邻接关系转化为二维列表graph
,然后调用tarjan(graph)
그래프
로 변환한 다음 tarjan(graph)
를 호출하여 반환하기만 하면 됩니다. 강하게 연결된 구성 요소 목록. 요약: 이 글에서는 Python에서 Tarjan 알고리즘을 작성하는 방법을 소개하고 구체적인 코드 예제를 첨부합니다. Tarjan 알고리즘의 기본 아이디어를 이해함으로써 우리는 이 알고리즘을 더 잘 적용하여 강하게 연결된 구성 요소 문제를 해결할 수 있습니다. 이 글이 독자들이 Tarjan 알고리즘을 이해하고 사용하는 데 도움이 되기를 바랍니다. 🎜위 내용은 Python에서 Tarjan 알고리즘을 작성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!