○Depth-First Search (DFS)

 ▷G의 모든 Vertices, Edges를 탐색

 ▷G가 Conncted graph인지 확인

 ▷G의 Connected components를 계산

 ▷G의 Spannng forest를 계산

 

 ▷O(e + v) - 각 vertex/edge가 2번씩 마킹됨. (UNEXPLORED, VISITED/BACK)

 

 ▶Algorithm

  ▷모든 U, V를 UNEXPLORED로 마킹

 

  ▶모든 Vertices에 대해 DFS(G, v)를 적용

   ▷해당 vertex를 VISITED로 마킹 

   ▶vertex의 모든 incident edges에 대해

    ▷만약 UNEXPLORED라면, edge의 opposite를 받아옴.

     ▷opposite이 UNEXPLORED라면,  edge를 DISCOVERY로 마킹하고, opposite에 대해 DFS(G,v)

     ▷opposite이 UNEXPLORED가 아니라면 edge를 BACK으로 마킹

 

 

 ▶특성

  ▷모든 Vertices, Edges를 방문

  ▷DISCOVERY edges로 Spanning Tree를 만들 수 있다.

 

 

 ▶Path finding

  ▷원래 알고리즘에서 Stack추가 (목적지에 도달하면 Stack 반환)

  ▷방문시 push, 나갈시 pop.

 

 ▶Cycle finding

  ▷back edge (v, w)를 만나면 w까지의 stack을 반환

 

 

○Breadth-First Search (BFS)

 ▷G의 모든 Vertices, Edges를 탐색

 ▷G가 Conncted graph인지 확인

 ▷G의 Connected components를 계산

 ▷G의 Spannng forest를 계산

 

 ▷O(e + v) - 각 vertex/edge가 2번씩 마킹됨. (UNEXPLORED, VISITED/CROSS)

 

 ▶Algorithm

  ▷모든 U, V를 UNEXPLORED로 마킹

 

  ▶모든 Vertices에 대해 BFS(G, v)를 적용

   ▷해당 vertex를 VISITED로 마킹

   ▷새로운 Sequence (L_0)를 만들고 해당 Vertex를 insertBack

   ▷i = 0

   ▶L_i가 empty할 때 까지

    ▷새로운 Sequence (L_i+1) 생성

     ▶모든 L_i element에 대해

      ▶모든 incidend edges에 대해

      ▷만약 UNEXPLORED라면, edge의 opposite를 받아옴.

       ▷opposite이 UNEXPLORED라면,

        ▷edge를 DISCOVERY로 마킹

        ▷opposite을 VISITED로 마킹후, L_i+1에 insertBack

       ▷opposite이 UNEXPLORED가 아니라면 edge를 CROSS으로 마킹

    ▷i++

 

 

 ▶특성

  ▷모든 Vertices, Edges를 방문

  ▷DISCOVERY edges로 Spanning Tree를 만들 수 있다.

  ▷L_0을 root로 한 Tree로 봤을 때, 각 Level은 root에서 도달하는데 필요한 최소 edge 수이다.

 

 

※DFS vs BFS

 

'컴퓨터 지식 > 자료구조' 카테고리의 다른 글

Graphs  (0) 2020.12.10
Heap  (0) 2020.12.05
Priority Queues  (0) 2020.12.04
Binary Tree  (0) 2020.11.20
Tree  (0) 2020.11.20

+ Recent posts