그래프 탐색( DFS, BFS )

Jifrozen·2021년 5월 25일
0

Algorithm

목록 보기
1/70

그래프 탐색( DFS, BFS )

  • 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문

깊이 우선 탐색( DFS, Depth-First Search )

임의의 노드에서 시작하여 최대한 깊숙이 들어가서 노트를 방문한 후,

다시 돌아가 다른 경로를 탐색하는 알리고리즘이다.

  1. 시작 노드를 스택에 삽입 방문 처리
  2. 스택의 최상단 노드에 방문 방문하지 않은 인접 노드가 있으면 그 인접 노트를 스택에 낳고 방문 처리를 한다.
  3. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다
  4. 반복한다
# DFS 함수 정의
def dfs(graph, v, visited):
    # 현재 노드를 방문 처리
    visited[v] = True
    print(v, end=' ')
    # 현재 노드와 연결된 다른 노드를 재귀적으로 방문
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 9

# 정의된 DFS 함수 호출
dfs(graph, 1, visited)

너비 우선 탐색 ( BFS Breadth-First Search )

임의의 노트를 선택해 인접한 노드를 먼저 탐색하는 알고리즘

  • 사용하는 경우 : 두 노드 사이의 최단 경로 , 임의의 경로를 찾고 싶을 때
  • 동작원리
  1. 탐색 시작 노드를 큐에 삽입하고 방문처리
  2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입시킨다.
  3. 반복한다
from collections import deque

# BFS 함수 정의
def bfs(graph, start, visited):
    # 큐(Queue) 구현을 위해 deque 라이브러리 사용
    queue = deque([start])
    # 현재 노드를 방문 처리
    visited[start] = True
    # 큐가 빌 때까지 반복
    while queue:
        # 큐에서 하나의 원소를 뽑아 출력
        v = queue.popleft()
        print(v, end=' ')
        # 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 9

# 정의된 BFS 함수 호출
bfs(graph, 1, visited)

0개의 댓글