Problem Solving/Online Judge
[BOJ] #1260 - DFS와 BFS
se0m
2021. 6. 19. 02:01
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
** 문제 유형
- DFS, BFS
** 풀이
- 기본적인 형태의 그래프를 단순히 DFS와 BFS로 탐색
- 이 문제는 '정점 번호가 작은 것'을 먼저 방문해야 함
- 모든 노드와 간선을 차례대로 조회하여 시간 복잡도는 O(N + M)
- 큐 구현을 위해 collections 라이브러리의 deque 사용
from collections import deque
def dfs(v): # 재귀용법 사용
print(v, end=' ')
visited[v] = True
for e in adj[v]:
if not(visited[e]):
dfs(e)
def bfs(v): # 반복문 사용
q = deque([v]) # BFS는 추가적인 큐가 반드시 필요함
while q:
v = q.popleft()
if not(visited[v]):
visited[v] = True
print(v, end=' ')
for e in adj[v]:
if e not in q:
q.append(e)
n, m, v = map(int, input().split())
adj = [[] for _ in range(n + 1)] # 연결 리스트 형태
for _ in range(m):
x, y = map(int, input().split())
adj[x].append(y)
adj[y].append(x)
for e in adj: # 값이 작은 정점부터 방문
e.sort()
visited = [False] * (n + 1)
dfs(v)
print()
visited = [False] * (n + 1)
bfs(v)