[백준/파이썬] 1260번 DFS와 BFS 풀이

업데이트:



문제 정보


풀이

문제

무방향 그래프와 시작 정점 V가 주어질 때 DFS 방문 순서와 BFS 방문 순서를 출력하는 문제입니다.

인접 정점이 여러 개면 번호가 작은 정점부터 방문합니다.

코드

n, m, v = map(int, input().split())

l = []
for _ in range(m):
    l.append(tuple(map(int, input().split())))

def dfs(n, m, v, l):
    result = [v]
    stack = [v]
    check = dict()
    for i in range(1, n+1):
        check[i] = False
    check[v] = True

    while len(stack) > 0:
        tmp = []
        for line in l:
            if line[0] == stack[-1] and not check[line[1]]:
                tmp.append(line[1])
            elif line[1] == stack[-1] and not check[line[0]]:
                tmp.append(line[0])
        if len(tmp) == 0:
            stack.pop()
        else:
            point = min(tmp)
            stack.append(point)
            result.append(point)
            check[point] = True
    return result

def bfs(n, m, v, l):
    result = [v]
    queue = [v]
    check = dict()
    for i in range(1, n+1):
        check[i] = False
    check[v] = True

    while len(queue) > 0:
        tmp = []
        for line in l:
            if line[0] == queue[0] and not check[line[1]]:
                tmp.append(line[1])
            elif line[1] == queue[0] and not check[line[0]]:
                tmp.append(line[0])
        if len(tmp) == 0:
            queue.pop(0)
        else:
            point = min(tmp)
            queue.append(point)
            result.append(point)
            check[point] = True
    return result

print(*dfs(n, m, v, l))
print(*bfs(n, m, v, l))

설명

간선 목록에서 현재 정점과 연결된 미방문 정점을 모아 가장 작은 번호(min)를 선택해 진행합니다.

  • DFS: 스택 기반 깊이 우선 탐색
  • BFS: 큐 기반 너비 우선 탐색

각 탐색의 방문 순서를 출력합니다.



댓글남기기