[백준]DFS 와 BFS

YanZ·2021년 6월 17일
0

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
4 5 1
1 2
1 3
1 4
2 4
3 4

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
1 2 4 3
1 2 3 4

코드

  • 그래프를 표현하는 방법 두가지 ( 인접행렬 , 인접리스트 ) 중 인접행렬을 선택했다. -> 원래 인접리스트로 나타냈으나, 입력에서 노드 순서대로 입력되지않는 경우 ex) 1~5 번 노드가 존재하는데 5번부터 입력되는 경우에는 인접리스트가 순서를 보장 X. 따라서 정점번호가 작은 것을 먼저 방문한다는 조건을 지킬 수 없었다. -> 인접행렬로 표현하기로 결정

  • 인접행렬 구현 시 , 노드는 1번 노드부터 시작하므로 , 노드가 N 개일때 인접행렬은 N+1 의 행,열을 가진 행렬로 구성했다. ( 0번째 행,열은 사용하지 X )

  • dfs_all, bfs_all 은 제외했다. ( 어짜피 모든 노드들이 최소 하나이상은 연결되어있다고 가정 ) 외딴 섬같은 노드는 없다고 가정했다.

  • dfs 는 재귀를, bfs 는 deque 를 사용하여 구현했다.

import sys
from collections import deque
# 연결 정보는 matrix로 표현
# dfs : 재귀, bfs : 덱 사용해서 구현

# 방문순서를 저장해둘 배열
dfs_visited=[]
bfs_visited=[]

# 인접행렬 update 하는 함수
def connect_node(a,b):
  matrix[a][b] = matrix[b][a] = 1


def dfs(start):
  dfs_visited.append(start) # 방문표시
  for w in range(len(matrix[start])): # 연결되어있는 노드 탐색하면서
      # 연결되어있는데 방문하지 않은 노드인 경우에는
      if matrix[start][w] == 1 and w not in dfs_visited:
        dfs(w) # 재귀호출
  return 


que=deque()
def bfs(start):
  que.append(start) # 처음 시작 노드를 큐에 담고
  bfs_visited.append(start) # 방문했다고 치고 시작
  while len(que)>0: # 큐가 비기 전까지 계속
    node = que.popleft() # 큐에서 하나 꺼내서
    for w in range(len(matrix[node])): # 해당 노드와 연결된 애들을 쭉 보면서
      # 연결되어있는데 방문하지 않은 경우에
      if matrix[node][w]==1 and w not in bfs_visited:
        que.append(w) # 큐에 추가하고
        bfs_visited.append(w) # 방문했다고 표시한다


N,M,V = map(int,sys.stdin.readline().split())
# 이중배열 ( N+1 로 하는 이유는 0번째 행, 열은 쓰지 않기때문 )
matrix = [[0 for _ in range(N+1)] for _ in range(N+1)]

#connect node
for i in range(M):
  a,b = map(int,sys.stdin.readline().split())
  connect_node(a,b)

dfs(V)
bfs(V)

for node in dfs_visited:
  print(node,end=' ')
print()
for node in bfs_visited:
  print(node,end=' ')
profile
개발이 재밌어지기 시작한 주니어 개발자 :)

0개의 댓글

관련 채용 정보