코딩테스트
[백준/파이썬] 1260 DFS와 BFS
Sun0727
2022. 6. 15. 14:44
#문제링크
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
#나의풀이
import sys
from collections import deque
def DFS(number):
print(number, end=' ')
ch[number] = 1
for i in range(1, n+1):
if board[number][i] == 1 and ch[i] == 0:
DFS(i)
def BFS(number):
Q = deque([number])
ch[number] = 1
while Q:
tmp = Q.popleft()
print(tmp, end=' ')
for i in range(1, n+1):
if board[tmp][i] == 1 and ch[i] == 0:
Q.append(i)
ch[i] = 1
if __name__ == '__main__':
n, m, v = map(int, sys.stdin.readline().split())
board = [[0] * (n+1) for _ in range(n+1)]
ch = [0] * (n+1)
for _ in range(m):
s, e = map(int, sys.stdin.readline().split())
board[s][e] = 1
board[e][s] = 1
DFS(v)
ch = [0] * (n+1)
print()
BFS(v)
#해설
DFS와 BFS로 그래프를 방문하여 방문한 순서대로 출력하는 문제
방문했는지 여부를 확인하기 위해 체크배열(ch)를 만들어서 방문했을시 값을 1로 바꾸고 각 조건문에 0이 아닐시 다시 방문하지 않도록 설정했다.
DFS는 깊이우선탐색으로 조건문에 일치하는 값이 나온다면 바로 재귀로 다시 넘어간다.
예를들어 N까지의 수가 있다고 했을때 1을 방문했을때 반복문을 돌면서 1~N까지 도는데 2에서 조건문이 일치했을경우 다시 2를 방문해서 1~N까지 돌게된다. 반면에 BFS는 넓이우선탐색으로 1을 방문하고 1~N까지 전체를 검사해 순서대로 방문할 값을 저장해놓고 하나씩 꺼내어 방문하는데 이후 조건에 일치하더라도 기본에 저장된곳에 마지막에 값을 추가시켜 나중에 방문하게 된다.