11724

백준 11724번

Link: 11724번: 연결 요소의 개수


문제 설명

기초적인 DFS, BFS 문제다.

2차원 배열에 연경 요소들을 1로 표시하고, BFS나 DFS를 사용하여 탐색하면서 연결된 요소의 갯수를 구하는 문제.

한가지 간과하기 쉬운 사실은, 이 그래프는 방향이 없는 그래프이기 때문에 연결시 쌍방향을 전부 1로 설정해줘야 한다는 점.

처음에는 배열 인덱스때문에 두어번 틀렸다가 맞게 풀었더니 시간초과가 났다.

BFS를 사용하여 시간 내에 풀기 위해서는 큐에서 정점을 뺄 때가 아닌 큐에 넣는 시점에 visit을 표시해야 한다는 것을 알게 되었다.

오늘은 BFS, DFS 감찾는다고 생각하고 앞으로 집중적으로 어려운 문제도 풀어볼 예정이다.


정답 코드

//
// Created by Keith_Lee on 21/01/2019.
//

#include <iostream>
#include <queue>

using namespace std;

int N, M;
int map[1001][1001] = {0, };
bool visit[1001] = {false, };

int result = 0;

void BFS(int start){
    queue<int> Queue;
    Queue.push(start);

    while(!Queue.empty()){
        int next = Queue.front();
        Queue.pop();

        for(int i=1; i<=N; i++){
            if(!visit[i] && map[next][i] == 1){
                visit[i] = true;
                Queue.push(i);
            }
        }
    }

    result++;
}

int main(){
    cin >> N >> M;

    for(int i=0; i<M; i++){
        int start, end;
        cin >> start >> end;
        map[start][end] = 1;
        map[end][start] = 1;
    }

    for(int i=1; i<=N; i++){
        if(!visit[i]){
            visit[i] = true;
            BFS(i);
        }
    }

    cout << result << '\n';

    return 0;
}