DFS (Depth-First Search)
깊이 우선 탐색 : 깊은 부분을 우선적으로 탐색하는 알고리즘
스택 자료구조 또는 재귀 함수 이용
1. 탐색 시작 노드를 스택에 삽입하고 방문 처리
2. 인접 노드 스택에 넣고 방문 처리
2-1) 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리
2-2) 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드 꺼내기
3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복
BFS (Breadth-First Search)
너비 우선 탐색 : 가까운 노드부터 우선적으로 탐색하는 알고리즘
큐 자료구조 이용
1. 탐색 시작 노드를 큐에 삽입하고 방문 처리
2. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복
DFS/BFS 코드 예시
https://www.acmicpc.net/problem/1260
import sys
from collections import deque
input = sys.stdin.readline
n, m, v = map(int, input().split())
graph = [[] for _ in range(n + 1)]
def dfs(v):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
dfs(i)
def bfs(v):
queue = deque([v])
visited[v] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
for i in range(len(graph)):
graph[i].sort()
visited = [False] * (n + 1)
dfs(v)
print()
visited = [False] * (n + 1)
bfs(v)
'Algorithm 개념 정리' 카테고리의 다른 글
Topological Sorting(위상 정렬)의 개념, 구현 방법 (0) | 2022.11.19 |
---|---|
브루트 포스(Brute Force) (0) | 2022.07.25 |
다이나믹 프로그래밍 Dynamic Programming (0) | 2022.06.22 |