4-2. 그래프의 탐색(DFS, BFS)

2019. 5. 16. 21:05Programming/알고리즘 수강내용 정리

반응형

그래프의 탐색

  • 목적: 시작점 X로 시작하여 모든 정점을 1번씩 방문하고자 한다.

  • 깊이 우선 탐색(DFS)

    • 스택을 이용해서 갈 수 있는 만큼 최대한 많이 가고, 더 이상 갈 수 없으면 이전 정점으로 돌아간다.

    • 스택을 이용하는 가장 쉬운 방법은 재귀 호출을 이용하는 방법이다.

    • 인접 행렬을 이용한 구현은 다음과 같다.
      정점의 갯수를 V라고 할 때, 시간 복잡도는 O(v^2)가 된다.

      void dfs(int x) {
        check[x] = true;
        printf("%d ", x);
        for(int i=0; i<=n; i++) {
          if(a[x][i] == 1 && check[i] == false) {
             dfs(i);
          }
        }
      }
    • 인접 행렬을 이용한 구현은 다음과 같다.
      정점의 갯수를 V, 간선의 갯수를 E라고 할 때 시간복잡도는 O(V+E)가 된다.

      void dfs(int x) {
        check[x] = true;
        printf("%d ", x);
        for(int i=0; i<=n; i++) {
          if(a[x][i] == 1 && check[i] == false) {
             dfs(i);
          }
        }
      }
  • 너비 우선 탐색(BFS)

    • 큐를 이용해서, 현재 정점에서 갈 수 있는 정점을 모두 큐에 넣는 방법이다. 큐에 넣을 때 방문했다고 체크해야 하는 점에 주의하자.

    • 인접행렬을 이용한 구현은 다음과 같다.
      시간복잡도는 O(V^2)가 된다.

      queue<int> q;
      check[1] = true; q.push(1);
      while (!q.empty()) {
          int x = q.front(); q.pop();
          printf("%d ",x);
          for (int i=1; i<=n; i++) {
              if (a[x][i] == 1 && check[i] == false) {
                  check[i] = true;
                  q.push(i);
              }
          }
      }
    • 인접리스트를 이용한 구현은 다음과 같다.
      시간복잡도는 O(V+E)가 된다.

      queue<int> q;
      check[1] = true; q.push(1);
      while (!q.empty()) {
           int x = q.front(); q.pop();
        printf("%d ",x);
           for(int i=0;i<a[x].size();i++) {
               int y = a[x][i];
               if (check[y] == false) {
                   check[y] = true; q.push(y);
               }
           }
       }
1260 DFS와 BFS, 백준 온라인 저지
  • 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 문제이다.
11724 연결 요소, 백준 온라인 저지
  • 여러개로 나누어진 각각의 그래프를 연결 요소라고 한다.
  • 연결 요소에 속한 모든 정점을 연결하는 경로가 있어야 한다. 또, 다른 요소에 속한 정점과 연결하는 경로가 있으면 안된다.
  • 연결 요소를 구하는 것은 DFS나 BFS 탐색을 이용해서 구할 수 있다.
1707 이분 그래프, 백준 온라인 저지
  • 그래프를 다음처럼 A, B로 나눌 수 있으면 이분 그래프라고 한다.
    • A에 포함되어 있는 정점끼리 연결된 간선이 없다.
    • B에 포함되어 있는 정점끼리 연결된 간선이 없다.
    • 모든 간선의 한 끝 점은 A에, 다른 끝 점은 B에 있다.
  • 그래프를 DFS또는 BFS탐색으로 이분 그래프인지 아닌지 알아낼 수 있다.
반응형

'Programming > 알고리즘 수강내용 정리' 카테고리의 다른 글

4-4. BFS  (0) 2019.05.17
4-3. 플러드 필  (0) 2019.05.17
4-1. 그래프와 BFS  (0) 2019.05.14
2-4. 비트마스크  (0) 2019.05.14
2-3. 재귀함수 사용하기  (0) 2019.05.13