
그래프에서는 깊이우선탐색과 너비우선 탐색 방식으로 모든 정점을 방문한다.
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) 위를 더 이상 수행할 수 없을 때까지 반복
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)
import queue
q = queue.Queue()
q.put(1)
q.get() # 1
print(q.qsize()) # 0