그래프는 정점(vertex)과 정점사이를 연결하는 간선(edge) 으로 구성된 한정된 자료구조를 의미한다. - wikipedia
graph = {
'A' : ['B'],
'B' : ['A', 'C', 'H'],
...
}
BFS : 넓이 우선 탐색
정점을 기준으로 간선이 연결되어있는 모든 정점을 차례로 방문함
Queue를 사용하여 구현
from collections import deque
def bfs(graph, root):
visited = [] # 방문한 노드를 저장하는 리스트
queue = deque([root]) # 처음으로 방문할 노드를 큐에 enqueue
while queue: # 큐에 노드가 있으면
n = queue.popleft() # 큐의 맨 앞에 있는 노드를 dequeue
if n not in visited: # 노드를 아직 방문하지 않았다면
visited.append(n) # 노드를 방문함
queue.extend(graph[n]) # 방문한 노드와 연결된 노드들을 enqueue
return visited
DFS : 깊이 우선 탐색
정점을 기준으로 간선이 연결되어 있는 정점 중 하나를 선택해 이동하고, 다시 이동한 정점을 기준으로 인접 정점을 선택
재귀함수나 Stack을 사용하여 구현
# 재귀함수 사용
def dfs(graph, start, visited=[]):
visited.append(start) # 노드를 방문
for n in graph[start]: # 방문한 노드와 연결된 노드에 대해
if n not in visited: # 방문하지 않은 노드가 있으면
dfs(graph, n, visited) # 그 노드를 출발노드로 하여 dfs호출
return visited
# Stack 사용
from collections import deque
def dfs(graph, root):
visited = [] # 방문한 노드를 저장하는 리스트
stack = deque([root]) # 처음으로 방문할 노드를 스택에 push
while stack: # 스택에 노드가 있으면
n = stack.pop() # 스택의 맨 위의 노드를 pop
if n not in visited: # 노드를 아직 방문하지 않았다면
visited.append(n) # 노드를 방문함
stack.extend(graph[n]) # 방문한 노드와 연결된 노드들을 스택에 push
graph2 = {'A' : ['B', 'C', 'D'], # B
'B' : ['A', 'C'], # / \
'C' : ['A', 'B', 'D'], # A - C
'D' : ['A', 'C']} # \ /
# D
graph = [[0,1,1,1], # B
[1,0,1,0], # / \
[1,1,0,1], # A - C
[1,0,1,0]] # \ /
# D