Algorithm/baekjoon

[BOJ 1260 C++] DFS와 BFS

식빵민 2022. 8. 23. 15:21
 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제 분석

  • 시간제한 : 2초 (약 2억 연산)
  • 그래프의 간선이 주어졌을때, DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색)을 구현하는 문제
  • 주의사항 : 어떤 노드와 연결 된 노드가 여러 개 일때 작은 값 부터 방문할 것
  • bool형 이차원 matrix를 만들어 i와j 번째 노드가 연결되어 있으면 matrix[i][j]는 true, 아니면 false

DFS (깊이 우선 탐색)

  • DFS(v) : 정점 v를 방문했다고 처리해주고 matrix[v][i](i = 1~n)에 대해 값이 true면 DFS(i) 실행
    이를 재귀적으로 반복

BFS (너비 우선 탐색)

  • 큐 생성 (FIFO)
  • 큐에 들어간 모든 원소에 대해 아래를 반복
    • 큐의 front v를 꺼내 v에 대해 방문했다고 처리해주고 
    • v와 연결된 정점을 큐에 삽입
#include <iostream>
#include <queue>

using namespace std;

int n, m, first, v1, v2;
bool graph[1001][1001];
bool visited[1001];

void DFS(int x) {
    cout << x << " ";
    visited[x] = true;
    for (int i = 1; i <= n; i++) {
        if (graph[x][i] && !visited[i])
            DFS(i);
    }
}

void BFS() {
    queue<int> q;
    q.push(first);
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        if (visited[x]) continue;
        visited[x] = true;
        cout << x << " ";
        for (int i = 1; i <= n; i++) {
            if (graph[x][i] && !visited[i])
                q.push(i);
        }
    }
}

int main() {
    cin >> n >> m >> first;

    while (m--) {
        cin >> v1 >> v2;
        graph[v2][v1] = true;
        graph[v1][v2] = true;
    }
    DFS(first);
    cout << endl;
    for (int i = 1; i <= n; i++)//BFS 실행전 방문처리 배열 초기화
        visited[i] = false;
    BFS();
}

배운 점

  • 사실 DFS와 BFS를 처음 배울때 이론적으로만 이해했지 코드를 정확히 짜기 힘들어 했다.
    하지만 이 문제를 풀며 확실히 코드적으로도 이해하며 DFS,BFS 코드에 대한 자신감이 조금 생겼다.