티스토리 뷰

문제

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

풀이과정

먼저 문제를 풀기 전에 연결요소에 대한 개념을 찾아봤다. 연결 요소란 1~N까지 정점으로 이루어져있는 그래프가 나누어 존재할 경우 각각의 그래프를 연결 요소라고 한다. 연결 요소에 속한 모든 정점은 연결하는 경로가 있어야 하며, 다른 연결 요소에 속한 정점과 연결하는 경로가 있으면 안된다.

아래 그림을 참고하면 쉽게 이해할 수 있다.


이러한 연결 요소의 개수를 세는 방법은 DFS를 이용하여 구현했다. DFS를 이용해 1부터 탐색을 시작하며 DFS(1) 이후에 check[i]가 false로 나오면 연결요소가 하나 더 있다는 뜻으로 해석했다.

소스코드

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

vector<int> a[1001];
bool check[1001];

int N, M, ans;

void DFS(int node)
{
    check[node] = true;

    for (int i = 0; i < a[node].size(); i++)
    {
        int next = a[node][i];
        if (check[next] == false)
        {
            DFS(next);
        }
    }
}
int main()
{
    cin.sync_with_stdio(false);

    cin >> N >> M;

    while (M--)
    {
        int u, v;
        cin >> u >> v;
        a[u].push_back(v); a[v].push_back(u);
    }

    for (int i = 1; i <= N; i++)
    {
        if (check[i] == false)
        {
            DFS(i);
            ans += 1;
        }
    }

    cout << ans << "\n";

    return 0;
}


'알고리즘 > 백준' 카테고리의 다른 글

[백준] 9935번 문자열 폭발  (0) 2018.01.10
[백준] 1260번 DFS와 BFS  (0) 2018.01.09
[백준] 2193번 이친수  (0) 2018.01.03
[백준] 11057번 오르막 수  (0) 2018.01.03
[백준] 2309번 일곱 난쟁이  (0) 2018.01.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함