[Algorithm] 깊이우선탐색(DFS), 너비우선탐색(BFS)

parkheeddong·2023년 1월 3일

알고리즘

목록 보기
1/5

그래프에서는 깊이우선탐색과 너비우선 탐색 방식으로 모든 정점을 방문한다.

그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘

1) 그래프 G에 대하여 임의의 정점 A에서 시작하여, 이웃 정점 B를 방문한다. 그리고 방금 방문한 이웃 정점 C를 방문하는 방식으로 진행

2) 특정 정점(예:C)의 이웃 정점을 모두 방문한 후, 이전 정점(예:B)로 되돌아가는 백트래킹 탐색을 수행하는 방식으로 진행

3) 리스트로 구현

adj_list = [[2,1],[3,0],[3,0],[9,8,2,1],[5],[7,6,4],[7,5],[6,5],[3],[3]]

n = len(adj_list)

visited = [False]*n

def dfs(v):
    visited[v] = True
    print(v, ' ', end= '')
    for i in adj_list[v]:
        if visited[i]==True:
            pass
        else:
            dfs(i)

# 0  2  3  9  8  1  4  5  7  6 


print('DFS 방문 순서')
for i in range(n):
    if visited[i]==True:
        pass
    else:
        dfs(i)

(4) 스택 자료구조를 이용한 동작과저ㅏㅇ

  • 탐색 시작 노드를 스택에 삽입 후 방문처리

  • 스택 최상단 노드에 방문하지 않은 인접노드가 있으면 그 인접 노드를 스택에 넣고 방문처리. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.

  • 위를 더 이상 수행할 수 없을 때까지 반복


가까운 노드부터 탐색하는 알고리즘.

선입선출 방식인 큐 자료구조를 이용하여 구현한다.

(1) 탐색 시작 노드를 큐에 삽입 후 방문처리

(2) 큐에서 노드를 꺼내 해당 노드의 인접 노드 중 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리

(3) 위를 더 이상 수행할 수 없을 때까지 반복

python 구현

from queue import Queue

adj_list = [[2,1],[3,0],[3,0],[9,8,2,1],[5],[7,6,4],[7,5],[6,5],[3],[3]]

n = len(adj_list)

visited = [False]*n

def bfs(v):
    queue = Queue()
    visited[v] = True
    queue.put(v)
    while not queue.qsize() == 0:
        v = queue.get()
        print(v, ' ', end= '')
        for i in adj_list[v]:
            if visited[i]==True:
                pass
            else:
                visited[i] = True
                queue.put(i)

# 0  2  1  3  9  8  4  5  7  6

print('BFS 방문 순서')
for i in range(n):
    if visited[i]==True:
        pass
    else:
        bfs(i)
  • 파이썬은 queue 모듈을 제공한다
import queue

q = queue.Queue()

q.put(1)

q.get()  # 1

print(q.qsize()) # 0

0개의 댓글