문제
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
문제 요약
N개의 정점과 정점을 잇는 M개의 간선으로 이루어진 그래프를 입력 받고, 그래프를 V번 정점부터 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력한다.
+ 정점 번호는 1번부터 N까지 존재한다.
+ 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문한다.
코드
from collections import deque
def dfs(num):
for n_num in graph[num]:
if check[n_num] == 0: # 아직 탐색하지 않은 친구라면
check[n_num] = 1
d_res.append(n_num)
dfs(n_num)
def bfs(num):
que = deque()
que.append(num) # 시작 노드 번호를 미리 큐에 저장
check[num] = 1
while que:
n_num = que.popleft()
b_res.append(n_num)
for i in graph[n_num]: # 해당 노드와 인접한 노드 번호 중
if check[i] == 0: # 방문하지 않은 노드라면
check[i] = 1
que.append(i)
N, M, V = map(int, input().split())
# N은 정점 개수, M은 간선의 개수, V는 탐색을 시작할 정점 번호
graph = [[] for _ in range(N + 1)]
# 정점 번호가 1번부터 N번까지 이므로 N + 1 크기의 인접 리스트 생성 (인덱스 0은 사용 X)
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
# 방문 가능한 정점이 여러 개라면 작은 번호를 먼저 방문 => 인접리스트를 오름차순 정렬
for i in range(N + 1):
graph[i] = sorted(graph[i])
# 이전 탐색에서 방문했는지를 체크하는 배열 (방문: 0, 방문 X: 1)
check = [0] * (N + 1)
d_res = [] # DFS 탐색 순으로 노드 번호 저장
b_res = [] # BFS 탐색 순으로 노드 번호 저장
check[V] = 1 # 방문 표시 체크
d_res.append(V)
dfs(V) # V번 정점부터 dfs 탐색
check = [0] * (N + 1) # 다시 bfs 탐색도 해야하므로 check 초기화
bfs(V) # V번 정점부터 bfs 탐색
print(*d_res)
print(*b_res)
코드 설명
1. a번 노드와 b번 노드를 잇는 간선을 입력 받고 인접 리스트에 추가한다.
+ 방문 가능한 정점이 여러 개라면 작은 번호를 먼저 방문해야 하므로 인접 리스트를 오름차순 정렬한다.
2. dfs, bfs 함수를 통해 V번 노드부터 DFS, BFS를 진행하고 방문한 노드 번호를 배열에 담아 출력한다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/Python] 2667번: 단지번호붙이기 (2) | 2023.09.01 |
---|---|
[백준/Python] 2468번: 안전 영역 (2) | 2023.08.29 |
[백준/python] 13023번: ABCDE (0) | 2023.08.27 |
[백준/python] 2644번: 촌수계산 (0) | 2023.08.25 |
[백준/python] 10026번: 적록색약 (2) | 2023.08.06 |