순회 – 그래프에서의 BFS

Reading time ~1 minute

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.


그래프 순회

순회(traversal)

  • 그래프의 모든 노드들을 방문하는 일

대표적 두 가지 방법

  • BFS (Breadth-First Search, 너비우선순회)
  • DFS (Depth-First Search, 깊이우선순회)

너비우선순회 (BFS)

BFS 알고리즘은 다음 순서로 노드들을 방문

BFS

큐를 이용한 너비우선순회

큐BFS

큐BFS2

큐BFS3


수도코드

BFS_수도코드


BFS와 최단경로

  • S에서 Li에 속한 노드까지의 최단 경로의 길이는 i이다.

    (여기서 경로의 길이는 경로에 속한 에지의 개수를 의미한다.)

  • BFS를 하면서 각 노드에 대해서 최단 경로의 길이를 구할 수 있다.

BFS_최단경로

입력 : 방향 혹은 무방향 그래프 G = (V, E), 그리고 출발 노드 s ∈ V

출력 : 모든 노드 v에 대해서

  • d[V] = s로 부터 v까지의 최단 경로의 길이(에지의 개수)
  • π[V] = s로부터 c까지의 최단경로상에서 v의 직전 노드(predecessor)

    BFS_수도코드2

  • 약간 변경한 버젼(π[s]가 아니라 π[u]다.)

    BFS_수도코드3


각 노드 v와 π[V]를 연결하는 에지들로 구성된 트리

  • BFS 트레이서 S에서 V까지의 경로는 s에서 v까지 가는 최단경로

  • 어떤 에지도 2개의 layer를 건너가지 않는다.
    (동일 레이어의 노드를 연결하거나, 혹은 1개의 layer를 건너간다.)

    BFS_트리


너비우선순회: 최단 경로 출력하기

너비우선순회_최단_경로_출력


너비우선순회 (BFS)

  • 그래프가 disconnected이거나 혹은 방향 그래프라면 BFS에 의해서 모든 노드가 방문되지 않을 수도 있음

  • BFS를 반복하여 모든 노드 방문

    BFS-ALL( G )
    {
      while there exists unvisited node v
        BFS(G, V);
    }