카테고리 없음
백준 1260번 : DFS와 BFS(Python, 파이썬)
에르미타쥬
2021. 1. 7. 14:20
풀어본 문제를 복습하고 있다.
'단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고'라는 조건을 주의해야 한다.
인접 리스트의 요소에 접근했을 때 BFS의 경우 인접 리스트 요소를 오름차 순, DFS의 경우 인접 리스트 요소를 내림차 순으로 정렬해주어야 한다.
예를 들면 인접 리스트의 특정 요소 adj[i] = [2,5,1]이 있다고 가정하자.
오름차 순으로 정렬 시 adj[i] = [1,2,5], 내림차 순으로 정렬 시 [5,2,1]이다.
원소들은 정점이므로 queue와 stack에 담아주면 queue = [... 1, 2, 5], stack = [... 5, 2, 1]로 쌓이게 된다.
이렇게 되면 탐색을 진행 시 queue와 stack 둘 다에서 정점 번호가 작은 것을 먼저 꺼낼 수 있게 된다. (queue는 선입선출, stack은 선입 후출이므로)
import sys, collections
def bfs(n, st, adj, res1):
visited = [0] * (n+1)
q = collections.deque()
q.append(st)
while q:
v = q.popleft()
if not visited[v]:
visited[v] = 1
res1.append(v)
for sv in adj[v]:
if not visited[sv]:
q.append(sv)
return res1
def dfs(n, st, adj, res2):
visited = [0] * (n+1)
stack = []
stack.append(st)
while stack:
v = stack.pop()
if visited[v] == 0:
visited[v] = 1
res2.append(v)
for sv in sorted(adj[v], reverse=True):
if not visited[sv]:
stack.append(sv)
return res2
n, m, v = map(int, sys.stdin.readline().split())
adj = [[] for _ in range(n+1)]
for _ in range(m):
s, e = map(int, sys.stdin.readline().split())
adj[s].append(e)
adj[e].append(s)
for i in range(1, len(adj)):
adj[i] = sorted(adj[i])
print(" ".join(map(str,dfs(n, v, adj, []))))
print(" ".join(map(str,bfs(n, v, adj, []))))