For Programmer
백준 1260번 파이썬 문제풀이(큐와 그래프 - DFS와 BFS) 본문
728x90
해당 문제는 DFS와 BFS의 기본개념을 이해하기 좋은문제이다. DFS는 재귀로 구현하는게 보통이고 BFS는 queue로 구현하는게 보통이다. 또한 입력받은 노드의 개수만큼 이차원 리스트로(이차원 리스트의 인덱스:각 노드, 해당인덱스의 값들: 노드들과 연결 여부) False로 초기화한다음 만약 연결되어 있다면 True로 바꿔주는 형식으로 구현해도 되고 혹은 정점만 입력 받아서 그 정점만 찾아나가는 방식으로 구현해도 된다. 단, 정점만 찾아나가는 방식으로 구현할 경우 낮은 숫자부터 탐색하라고 되어있으니 오름차순 정렬이 필요하다. queue는 리스트를 사용해도 되고 deque을 사용해도 되지만 popleft가 구현되어 있는 시간복잡도가 더 낮은 deque을 사용하는 것이 좋다.
1. True,False 로 구현
from collections import deque
N, M, V = map(int, input().split())
graph = [[False] * (N + 1) for _ in range(N + 1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a][b] = True
graph[b][a] = True
visited1 = [False] * (N + 1) # dfs의 방문기록
visited2 = [False] * (N + 1) # bfs의 방문기록
def bfs(V):
q = deque([V]) # pop메서드의 시간복잡도가 낮은 덱 내장 메서드를 이용한다
visited2[V] = True # 해당 V 값을 방문처리
while q: # q가 빌때까지 돈다.
V = q.popleft() # 큐에 있는 첫번째 값 꺼낸다.
print(V, end=" ") # 해당 값 출력
for i in range(1, N + 1): # 1부터 N까지 돈다
if not visited2[i] and graph[V][i]: # 만약 해당 i값을 방문하지 않았고 V와 연결이 되어 있다면
q.append(i) # 그 i 값을 추가
visited2[i] = True # i 값을 방문처리
def dfs(V):
visited1[V] = True # 해당 V값 방문처리
print(V, end=" ")
for i in range(1, N + 1):
if not visited1[i] and graph[V][i]: # 만약 i값을 방문하지 않았고 V와 연결이 되어 있다면
dfs(i) # 해당 i 값으로 dfs를 돈다.(더 깊이 탐색)
dfs(V)
print()
bfs(V)
2. 정점만 저장으로 해결
from collections import deque
def dfs(start):
visited[start] = True
print(start, end=" ")
for i in graph[start]:
if not visited[i]:
dfs(i)
def bfs(start):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=" ")
for i in graph[v]:
if not visited[i]:
visited[i] = True
queue.append(i)
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)
# 정렬
for i in graph:
i.sort()
# dfs
visited = [False] * (N + 1)
dfs(V)
print()
# bfs
visited = [False] * (N + 1)
bfs(V)
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 1707번 파이썬 문제풀이(큐와 그래프 - 이분 그래프) - DFS, BFS (5) | 2021.11.20 |
---|---|
백준 11724번 파이썬 문제풀이(큐와 그래프 - 연결 요소의 개수) - DFS, BFS (0) | 2021.11.19 |
백준 13023번 파이썬 문제풀이(큐와 그래프 - ABCDE) (0) | 2021.11.15 |
백준 13398번 파이썬 문제풀이(DP - 연속합 2) (0) | 2021.11.11 |
백준 11054번 파이썬 문제풀이(DP - 가장 긴 바이토닉 부분 수열) (0) | 2021.11.09 |
Comments