참조: https://www.youtube.com/watch?v=7C9RgOcvkvo
참조: https://www.youtube.com/watch?v=BsYbdUnKZ-Y
참조: https://veggie-garden.tistory.com/42
참조: https://iq.opengenus.org/dfs-vs-bfs/
깊이 우선 탐색(Depth First Search)
그래프의 깊은 부분을 우선적으로 탐색하는 알고리즘이다.
스택 자료구조 또는 재귀함수를 사용해 그래프의 가장 깊은 곳까지 방문한 뒤, 다시 돌아가 다른 경로를 탐색한다.
동작 과정
탐색 시작 노드를 스택에 삽입하고 방문 처리. (이미 방문(탐색)했던 노드를 재방문하지 않기 위해)
스택의 최상단 노드에 방문하지 않은 인접 노드가 있다면 그 노드를 스택에 넣고 방문 처리. 만약 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼냄.
2번의 과정을 더 이상 수행할 수 없을 때까지 반복.
재귀 함수 사용 코드
import sys
input = sys.stdin.readline
N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def dfs_recursion(graph, start, visited):
visited[start] = True
for i in graph[start]:
if not visited[i]:
visited[i] = True
dfs_recursion(graph, i, visited)
import sys
input = sys.stdin.readline
N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def dfs_stack(graph, start, visited):
stack = []
stack.append(start)
while stack:
current = stack.pop()
if not visited[current]:
visited[current] = True
stack.extend(reversed(graph[current]))
너비 우선 탐색(Breadth First Search)
인접 노드를 계속 큐에 넣어가며 큐에 들어온 순서대로 탐색을 시작
동작 과정
탐색 시작 노드를 큐에 삽입하고 방문 처리.
큐에서 노드를 꺼내 해당 노드의 방문하지 않은 모든 인접 노드를 모두 쿠에 삽입하고 방문 처리.
2번 과정을 더 이상 수행할 수 없을 때까지 반복.
관련 코드
import sys
from collections import deque
input = sys.stdin.readline
N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def bfs_queue(graph, start, visited):
que = deque([start])
que.append(start)
while que:
current = que.popleft()
if not visited[current]:
visited[current] = True
que.extend(graph[current])