알고리즘 공부/Baekjoon [C++]

BaekJoon 11724: 연결 요소의 개수[C++] [silver2]

이포터 2022. 11. 23. 15:31

문제 링크

https://www.acmicpc.net/problem/11724

 

문제 설명

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

 

출력

첫째 줄에 연결 요소의 개수를 출력한다.

 

예제 입력 1

6 5
1 2
2 5
5 1
3 4
4 6

예제 출력 1

2

 

소스코드

#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#define MAX 51
using namespace std;
vector<int> map[1001];
bool check[1001];

void BFS(int start) {
    check[start] = true;
    queue<int> q;
    q.push(start);

    //q에 들어가있다면,
    //모든 간선을 확인한다.
    while (!q.empty()) {
        int now = q.front();
        //queue에 들어가 있는 것을 빼주고
        q.pop();
        

        // 현재 간선과 연결되어 있는 간선을 확인한다.
        for (int i = 0; i < map[now].size(); i++) {
            //만약에 방문하지 않은 곳이라면
            if (check[map[now][i]] == false) {
                //true로 바꾸어주고
                check[map[now][i]] = true;
                //다음 방문으로 체크해준다.
                q.push(map[now][i]);
            }
        }

    }
}

int main()
{
    int N, M;
    int num1, num2;
    int cnt = 0;
    cin >> N >> M;
    // N 정점의 개수
    // M 간선의 개수
    for (int i = 0; i < M; i++) {
        cin >> num1;
        cin >> num2;
        //간선 연결해주기
        map[num1].push_back(num2);
        map[num2].push_back(num1);
    }

    sort(map->begin(), map->end());

    for (int i = 1; i <= N; i++) {
        if (check[i] == false) {
            cnt++;
            BFS(i);
        }
            
    }
    cout << cnt << endl;
}

 

 

 

리뷰

이번 일주일은 DFS, BFS 공부에 몰두!