세리프 따라잡기

WEEK03- TIL DFS와 BFS 본문

SW사관학교 정글

WEEK03- TIL DFS와 BFS

맑은 고딕 2022. 4. 16. 17:48

DFS 기본 구현

1. 시작 노드에서 방문하지 않았으면 노드를 삽입해준다  == 방문 표시

2. 더 이상 방문이 불가능하다면, 탐색 중단하고 이전으로 돌아옴

 

*특징

1. 스택 or 재귀함수 사용

2. 한 방향으로 깊게 탐색

3. 깊이 제한 횟수를 늘려주자!

 

sys.setrecursionlimit(10**8) #깊이 제한 

def dfs(arr, cur, visited):
    visited[cur] = True
    for i in arr[cur]:
        if not visited[i]:
            dfs(arr, cur, visited)
            
            
# 나는 dfs(arr, cur, visited) 부분을 defaultdict를 이용해 graph에 담아서 사용

def dfs(v):
    visited[v]=1
    print(v,end=' ')
    for i in graph[v]:
        if not graph[i]:
            dfs(i)

 

BFS 기본 구현

1. 시작 노드에서 방문하지 않은 인접 노드를 큐에 삽입 == 방문 표시

2. 큐가 빌 때까지 큐에서 하나씩 꺼내서 방문하지 않은 인접 노드를 큐에 삽입 == 방문 표시

 

*특징

1. 큐를 사용 [덱이 더 효율적이라 deque로!]

2. 매 순간이 최적의 경우를 보장

3. 방문 체크를 큐에 넣기 전에 해줘야 한다

→ 불필요한 방문이 큐에 쌓여서 중복으로 방문되는 경우가 생겨, 메모리 초과가 발생

from collections import deque

def bfs(arr, start, visitet):
    queue = deque([start])
    visited[start] = True
    while queue:
        cur = queue.popleft()
        for i in arr[cur]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

 

 

참고

Comments