루트 노드 ( 임의의 노드 ) 에서 시작해 다음 분기로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
한 방향으로 계속 가다가 더 이상 갈 수 없게 됐을 때 가장 가까운 갈림길로 돌아와 다른 방향으로 다시 탐색을 진행
[ 활용 예시 ]
- 자동 미로 생성
- 유향 그래프의 사이클 파악
- 재귀적으로 동작(재귀, 스택)
- 어떤 노드를 방문(visited)했었는지 여부를 반드시 검사 (무한루프 방지)
- 모든 노드를 방문하고자 할 때 사용
- 장점
- 단점
[ 노드, 간선 : V , E ]
- 인접 리스트로 표현된 그래프: O(N+E)
- 인접 행렬로 표현된 그래프: O(N^2)
# dfs, 재귀, 인접 행렬, i 정점부터 시작
def dfs(i):
visit[i] = True
for j in range(1, n + 1):
if map[i][j] == 1 and not visit[j]:
dfs(j)
# DFS
GRAPH_SIZE = 1000
def dfs(x, v, visited):
if visited[x]:
return;
visited[x] = true;
printf(x), end=' '
for value in v[x]:
dfs(value, v , visited)
# 예시 그래프
v = [[] for _ in range(GRAPH_SIZE)]
v[1] = [2, 3]
v[2] = [1, 4, 5]
v[3] = [1]
v[4] = [2]
v[5] = [2]
visited = [False] * GRAPH_SIZE
DFS(1, v, visited)
def dfs(curr_node, graph, visited):
visited.add(curr_node)
for next_node in graph[curr_node]:
if next_node not in visited:
dfs(next_node, graph, visited)
return visited
--------------------------------------------------------------------
def solution():
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
visited = set()
dfs('A', graph, visited)
return visited