PS

백준 11724. 연결 요소의 개수

tose33 2021. 3. 17. 18:28

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

 

다시 푼 문제, 이전 글: tose33.tistory.com/4

 

정점 1에 대해 dfs(1)을 수행한다면, 정점 1에 이어진 모든 정점을 방문할 것이다. 

즉 dfs를 정점1에 대해 수행했는데 아직 방문하지 않은 정점이 남아있다면, 그 정점은 정점1과 이어지지 않은 정점이므로,

새로운 dfs 탐색을 시작할때마다 카운트를 증가시키면 그 카운트가 연결 요소의 개수이다.

 

#include <iostream>
using namespace std;
#include <vector>

vector<int> edge[1001];
bool mark[1001];

void dfs(int n) {
    if(mark[n]) return;
    mark[n] = true;
    //cout << n << ' ';

    for(int x : edge[n]) dfs(x);
}

int main() {
    int N, M; // 정점, 간선
    cin >> N >> M;

    for(int i = 0; i < M; i++) {
        int u, v;
        cin >> u >> v;

        edge[u].push_back(v);
        edge[v].push_back(u);
    }
/*
    for(int i = 0; i <= M; i++) {
        cout << i << ": ";
        for(int x : edge[i]) cout << x << ' ';
        cout << endl;
    } cout << endl;
*/

    int cnt = 0;
    for(int i = 1; i <= N; i++) {
        if(!mark[i]) { // 방문 안한 정점에대해 dfs 실행 
            dfs(i);
            cnt++;
        }
    }

    cout << cnt;
}

 

bfs로 풀어도 똑같다.