[파이썬] 백준 1260 : DFS와 BFS

728x90

[파이썬] 백준 1260 : DFS와 BFS

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

실버 2

그래프, DFS, BFS


DFS, BFS의 구현 방법을 알고 있는 것을 전제로 제시된 문제이다.

다만 정점을 방문은 반드시 오름차순 순서로 이루어져야 하기 때문에, 인접한 정점들을 오름차순으로 정렬한 후에 접근할 수 있도록 구현해야 한다.

 

bfs구현을 할 때는 시간 복잡도가 O(1)인 deque을 이용하는 것이 더 빠르다.

 

코드

from collections import deque
import sys; input = sys.stdin.readline

def bfs(graph, start, visited):
    queue = deque([start])
    visited[start] = True
    while queue:
        v = queue.popleft()
        print(v, end = ' ')
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

def dfs(graph, start, visited):
    visited[start] = True
    print(start, end = ' ')
    for i in graph[start]:
        if not visited[i]:
            dfs(graph, i, visited)

N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for i in range(M):
    x, y = map(int, input().split())
    graph[x].append(y)
    graph[y].append(x)

for i in range(1, N+1):  # 인접 정점을 오름차순 정렬한다.
    graph[i].sort()

visited = [False] * (N+1)

dfs(graph, V, visited)
print()

visited = [False] * (N+1)  # bfs탐색을 위해 방문 표시 리스트를 초기화한다.
bfs(graph, V, visited)
728x90