방문 순서는 1, 2, 7, 6, 8, 3, 4, 5가 됩니다.
DFS 소스 코드
# 그래프에서 각 노드가 연결된 정보를 표현
graph = [
[], # 0, 편의상 위 예시처럼 하기 위해 0번은 빈값으로 처리
[2, 3, 8], # 1과 연결된 노드
[1, 7], # 2와 연결된 노드
[1, 4, 5], # 3과 연결된 노드
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * len(graph) # 각 노드들의 방문 여부 리스트
def dfs(graph, v, visited):
visited[v] = True # 현재 노드를 방문 처리
print(v, end = " ")
# 현재 노드와 연결된 노드 중 방문을 하지 않은 노드인 경우
for i in graph[v]:
if visited[i] is False:
dfs(graph, i, visited) # 재귀 호출
이후 방문하지 않은 인접 노드가 없으므로 차례대로 Dequeue가 됩니다.
방문 순서는 1 2 3 8 7 4 5 6이 됩니다.
BFS 소스 코드
from collections import deque
# 그래프에서 각 노드가 연결된 정보를 표현
graph = [
[], # 0, 편의상 위 예시처럼 하기 위해 0번은 빈값으로 처리
[2, 3, 8], # 1과 연결된 노드
[1, 7], # 2와 연결된 노드
[1, 4, 5], # 3과 연결된 노드
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * len(graph) # 각 노드들의 방문 여부 리스트
def bfs(graph, start, visited):
# 큐 구현을 위해 deque 라이브러리 사용
queue = deque([start])
visited[start] = True # 현재 노드를 방문 처리
while queue: # 큐가 빌 때가지 반복
v = queue.popleft()
print(v, end = " ")
for i in graph[v]: # 아직 방문하지 않은 인접한 원소들을 큐에 삽입
if visited[i] is False:
queue.append(i)
visited[i] = True
BFS는 최단 경로를 구할 때, 목적지를 찾자마자 최단경로임이 보장되어 탐색을 종료할 수 있어 DFS에 비해 빠릅니다.
보통 재귀를 통해 시스템 스택을 사용하는 DFS에 비해 queue를 사용하므로 비교적 자유롭고 힙 공간을 넓게 쓸 수 있어
좀 더 넓은 범위 탐색에 유리합니다.
[Python] 검색 / 이진 검색(Binary search) (0) | 2021.12.14 |
---|---|
[Python] 정렬 / 병합 정렬(Merge Sort) (0) | 2021.12.07 |
[Python] 정렬 / 퀵 정렬(Quick Sort) (0) | 2021.11.30 |
[Python] 정렬 / 계수 정렬(Counting Sort) (0) | 2021.11.30 |
[Python] 정렬 / 삽입 정렬(Insertion sort) (0) | 2021.11.24 |