문제
https://www.acmicpc.net/problem/1260
답
from collections import deque
def dfs(graph, start, visited):
visited[start] = True
print(start, end=' ')
for neighbor in sorted(graph[start]):
if not visited[neighbor]:
dfs(graph, neighbor, visited)
def bfs(graph, start):
visited = [False] * (N + 1)
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for neighbor in sorted(graph[v]):
if not visited[neighbor]:
queue.append(neighbor)
visited[neighbor] = True
# 입력 받기
N, M, V = map(int, input().split())
graph = [[] for _ in range(N + 1)]
# 그래프 구성
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
# DFS 실행
visited = [False] * (N + 1)
dfs(graph, V, visited)
print()
# BFS 실행
bfs(graph, V)
그래프가 어떤 식으로 구성되고 출력되는가?
예제 입력 1을 사용하여 설명
예제 입력 1
4 5 1
1 2
1 3
1 4
2 4
3 4
1. 그래프 초기화:(인덱스 0은 사용하지 않음)
graph = [[], [], [], [], []]
2. 간선 정보 입력 후 그래프 구성
graph = [
[],
[2, 3, 4], # 정점 1의 인접 정점
[1, 4], # 정점 2의 인접 정점
[1, 4], # 정점 3의 인접 정점
[1, 2, 3] # 정점 4의 인접 정점
]
3. DFS 실행 과정: 시작 정점 1
방문: 1
│
└─→ 방문: 2
│
└─→ 방문: 4
│
└─→ 방문: 3
4. BFS 실행 과정: 시작 정점 1
큐: [1]
방문: 1
│
├─→ 방문: 2
│
├─→ 방문: 3
│
└─→ 방문: 4
도식화:
2
/ \
1---4
\ /
3
DFS 진행 순서:
- 1 방문 (출력)
- 1의 인접 정점 중 가장 작은 2 방문 (출력)
- 2의 인접 정점 중 아직 방문하지 않은 가장 작은 4 방문 (출력)
- 4의 인접 정점 중 아직 방문하지 않은 가장 작은 3 방문 (출력)
- 모든 정점 방문 완료
BFS 진행 순서:
- 1 방문 (출력) 및 큐에 1의 인접 정점 추가 [2, 3, 4]
- 큐에서 2 꺼내어 방문 (출력)
- 큐에서 3 꺼내어 방문 (출력)
- 큐에서 4 꺼내어 방문 (출력)
- 큐 비어있음, 종료
이 과정을 통해 DFS는 깊이 우선으로, BFS는 너비 우선으로 그래프를 탐색하며 각각의 결과를 출력하게 됩니다.
'컴퓨터 > 알고리즘' 카테고리의 다른 글
힙 정렬 알고리즘 Heap Sorting Algorithm (0) | 2025.03.24 |
---|---|
간단한 DP - 피보나치에 대하여 (0) | 2024.08.10 |
[DP] Dynamic Programming 동적 프로그래밍 (0) | 2024.07.31 |
Dynamic Programming (0) | 2024.06.12 |
동적 프로그래밍 DP (0) | 2024.05.30 |