2~3 과정을 모든 정점을 방문할 때까지 반복한다.
dfs_stack
def dfs(graph, start_node):
visited = [False] * (len(graph) + 1)
stack = [start_node]
while stack:
node = stack.pop()
if not visited[node] :
visited[node] = True;
print(node)
for adj_node in graph[node]: # 인접한 노드 방문
if not visited[adj_node]:
stack.append(adj_node)
# 그래프를 인접 리스트로 표현
graph = {
1: [2, 3],
2: [4, 5],
3: [],
4: [],
5: []
}
# DFS 알고리즘 실행
dfs(graph, 1) # 1 3 2 5 4
dfs_recursion
def dfs(graph, start_node,visited):
visited[start_node] = True
print(start_node)
for adj_node in graph[start_node]: # 인접한 노드 방문
if not visited[adj_node]:
dfs(graph,adj_node,visited)
# 그래프를 인접 리스트로 표현
graph = {
1: [2, 3],
2: [4, 5],
3: [],
4: [],
5: []
}
visited = [False] * (len(graph) + 1)
# DFS 알고리즘 실행
dfs(graph, 1,visited) # 1 2 4 5 3
위 과정을 큐가 빌 때까지 반복한다.
from collections import deque
def bfs(graph, start_node):
visited = [False] * (len(graph) + 1)
queue = deque([start_node])
visited[start_node] = True # 시작노드 방문 처리
while queue:
node = queue.popleft() # 이어붙인 노드를 꺼냄
print(node) # 방문 노드 출력
for adj_node in graph[node]: # 인접한 노드 방문
if not visited[adj_node]:
queue.append(adj_node) # 큐에 이어붙임
visited[adj_node] = True
# 그래프를 인접 리스트로 표현
graph = {
1: [2, 3],
2: [4, 5],
3: [],
4: [],
5: []
}
# BFS 알고리즘 실행
bfs(graph, 1) # 1, 2, 3, 4, 5
https://cafe.naver.com/dremdeveloper/418
https://cafe.naver.com/dremdeveloper/30