Algorithm/BOJ

[BOJ] #11724 연결 요소의 개수

jHoon0223 2024. 1. 11. 16:59

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

 

11724번: 연결 요소의 개수

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

www.acmicpc.net


BFS를 순회하면서 연결 요소의 갯수가 있는지 찾는 문제다. 처음엔 문제를 잘못 읽고 연결된 그래프가 몇개인지만 세아려서 출력하면 되는줄 알았는데, 아무 간선도 가지지않는 정점도 연결 요소에 포함시켜 구현해야 했다.

방향성 없고 가중치 없는 그래프다 보니 그냥 바로 BFS로 감을 잡고 풀었고, 백준 2606번 바이러스 문제와 유사한 부분이 많은 문제였다.

#include <iostream>
#include <vector>
#include <queue>

#define MAX 1005

using namespace std;

vector<int> Graph[MAX];
int visited[MAX];
int cnt = 0;
bool flag;

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

    while(!q.empty()) {
        int n = q.front();
        q.pop();

        for (int i=0; i<Graph[n].size(); i++) {
            int idx = Graph[n][i];

            if (!visited[idx]) {
                q.push(idx);
                visited[idx] = true;
                flag = true;
            }
        }
    }
}

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

    for (int i=0; i<M; i++) {
        int a,b;
        cin >> a >> b;

        Graph[a].push_back(b);
        Graph[b].push_back(a);
    }

    for (int i=1; i<=N; i++) {
        if (visited[i]) continue;
        else {
            BFS(i);

            if (flag == true) cnt++;
        }

        if (flag == false) cnt++;
    }

    cout << cnt << '\n';

    return 0;
}

간선없는 정점을 포함시키지 않아서 첫번째 시도는 틀렸었다.

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] #2178 미로 탐색  (0) 2024.02.02
[BOJ] #1012 유기농 배추  (0) 2024.02.02
[BOJ] #2667 단지번호붙이기  (0) 2024.01.10
[BOJ] #1697 숨바꼭질  (0) 2024.01.10
[BOJ] #2606 바이러스  (0) 2024.01.08