def dfs(start, visited = [False]*(N+1)):
visited[start] = True
for v in G[start]:
if not visited[v]:
dfs(v, visited)
return visited
방문하지 않은 노드(v)일 경우 dfs 함수를 호출해 방문해준다.
visited의 모든 노드가 방문처리 될때까지 재귀호출을 하는 형태이다.
from collections import deque
def dfs(start, visited=[False]*(N+1)):
stack = deque()
stack.append(start)
while stack:
v = stack.pop()
if not visited[v]:
visited[v] = True
for u in G[v]:
stack.append(u)
return visited
recursion depth를 고려해야하는 코드라면, 재귀대신 for문과 스택 자료구조를 사용하면 된다.
인접 노드를 차례로 저장하고, 최근 방문한 순으로 꺼내쓸수 있는 자료구조가 필요하기 때문에 스택을 사용하는 것이다.
from collections import deque
def bfs(start, visited=[False]*(N+1)):
que = deque()
que.append(start)
while que:
v = que.popleft()
if not visited[v]:
visited[v] = True
for u in G[v]:
que.append(u)
return visited