알고리즘
[백준(BOJ)] 1260번 DFS와 BFS
욘아리
2024. 1. 11. 23:18
문제
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하는 문제다.
예시
Example 1:
Input: 4 5 1
1 2
1 3
1 4
2 4
3 4
Output: 1 2 4 3
1 2 3 4
Example 2:
Input: 5 5 3
5 4
5 2
1 2
3 4
3 1
Output: 3 1 2 5 4
3 1 4 2 5
Example 3:
Input: 1000 1 1000
999 1000
Output: 1000 999
1000 999
풀이
from collections import deque
n, m, v = list(map(int, input().split()))
graph = [[0] * (n + 1) for i in range(n + 1)]
# 방문 여부 나타내는 리스트
visited_dfs = [0] * (n + 1)
visited_bfs = [0] * (n + 1)
# 간선 정보 그래프에 표시
for i in range(m):
a, b = map(int, input().split())
graph[a][b] = graph[b][a] = 1
# 깊이 우선 탐색
def dfs(node):
visited_dfs[node] = 1
print(node, end=' ')
for i in range(1, n+1):
if(visited_dfs[i] == 0 and graph[node][i] == 1):
dfs(i)
# 너비 우선 탐색
def bfs(node):
q = deque([node])
visited_bfs[node] = 1
while q:
node = q.popleft()
print(node, end=' ')
for i in range(1, n+1):
if(visited_bfs[i] == 0 and graph[node][i] == 1):
q.append(i)
visited_bfs[i] = 1
dfs(v)
print()
bfs(v)
- dfs 함수는 재귀적으로 깊이 우선 탐색을 수행한다. 방문한 노드는 visited_dfs 배열을 통해 표시하고, 해당 노드를 출력한다. 이후 해당 노드와 연결된 아직 방문하지 않은 이웃 노드들에 대해 재귀적으로 탐색을 진행한다.
- bfs 함수는 큐를 활용하여 너비 우선 탐색을 수행한다. 큐에서 노드를 꺼내어 방문 처리하고 출력한 후, 해당 노드와 연결된 아직 방문하지 않은 이웃 노드들을 큐에 추가하고 방문 처리한다. 큐가 빌 때까지 이 과정을 반복한다.