N, M, V = map(int, read().split()) g = [[] for _ inrange(N + 1)]
''' 정점 a와 b의 간선 연결 구현 '''
for _ inrange(M): a, b = map(int, read().split()) g[a].appned(b) g[b].append(a)
1 2 3 4 5 6 7 8
451# N, M, V 12# a, b 13 14 24 34 > g [[], [2, 3, 4], [1, 4], [1, 4], [1, 2, 3]]
Depth-First Search, DFS
깊이 우선 탐색: 최대한 깊이 내려가며 더 깊이 이동이 불가할 때 옆으로 이동
1 2 3 4 5 6 7 8 9 10 11
v = [Falsefor _ inrange(N + 1)]
defDFS(initPos): print(initPos, end = ' ') v[initPos] = True for i in g[initPos]: ifnot v[i]: DFS(i) v[i] = True
DFS(V)
현재 위치 방문 True
그래프 내에서 현재 위치와 연결된 정점들 (g[initPos])에 따라 방문하지 않았다면 재귀적으로 1번 실행
Breadth-First Search, BFS
너비 우선 탐색: 최대한 내려가지 않으며 같은 깊이에서 이동이 불가할 때 아래로 이동
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from collections import deque
q = deque() v = [Falsefor _ inrange(N + 1)]
defBFS(initPos): q.append(initPos) v[initPos] = True while q: tmp = q.popleft() print(tmp, end = ' ') for i in g[tmp]: ifnot v[i]: v[i] = True q.append(i)
BFS(V)
deque에 현재 위치 append() 및 현재 위치 방문 True
tmp 변수에 deque의 최신 값을 pop하여 현재 위치 업데이트
그래프 내에서 현재 위치와 연결된 정점들 (g[tmp])에 따라 방문하지 않았다면 deque에 append()
BOJ: 1260
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
import sys from collections import deque read = sys.stdin.readline
defDFS(initPos): print(initPos, end = ' ') v[initPos] = True for i in g[initPos]: ifnot v[i]: DFS(i) v[i] = True
defBFS(initPos): q.append(initPos) v[initPos] = True while q: tmp = q.popleft() print(tmp, end = ' ') for i in g[tmp]: ifnot v[i]: v[i] = True q.append(i)
N, M, V = map(int, read().split()) g = [[] for _ inrange(N + 1)]
for _ inrange(M): a, b = map(int, read().split()) g[a].append(b) g[b].append(a)