본문 바로가기

BAEKJOON/그래프

백준 11724번 [연결 요소의 개수](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 11724 [연결 요소의 개수]


문제 링크: https://www.acmicpc.net/problem/11724

문제 설명:

주어진 무방향 그래프에서 연결 요소의 개수를 구하는 문제입니다. 연결 요소란 서로 연결된 정점들의 최대 집합을 의미합니다.

입력:

  • 첫째 줄에 정점의 개수 n과 간선의 개수 m이 주어집니다. (1 ≤ n ≤ 1,000, 0 ≤ mn*(n-1)/2)
  • 둘째 줄부터 m개의 줄에 간선 정보가 주어집니다.

출력:

  • 연결 요소의 개수를 출력합니다.

예시:

입력:
6 5
1 2
2 5
5 1
3 4
4 6

출력:
2

문제 해결 코드


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

vector<int> adj[1001]; // 인접 리스트
bool visited[1001]; // 방문 여부를 저장하는 배열

// 깊이 우선 탐색 (DFS)
void DFS(int node) {
    if (visited[node]) return; // 이미 방문한 경우
    visited[node] = true; // 방문 표시
    for (int next : adj[node]) { // 인접 정점 탐색
        if (!visited[next]) {
            DFS(next);
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m; // 정점과 간선의 개수
    cin >> n >> m;

    // 그래프 입력
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v); // 양방향 그래프
        adj[v].push_back(u);
    }

    int components = 0; // 연결 요소의 개수
    for (int i = 1; i <= n; i++) {
        if (!visited[i]) { // 방문하지 않은 정점에서 DFS 시작
            DFS(i);
            components++; // 새로운 연결 요소 발견
        }
    }

    cout << components << '\n'; // 연결 요소의 개수 출력
    return 0;
}

코드 설명

이 코드는 DFS를 활용하여 주어진 그래프에서 연결 요소의 개수를 계산합니다. 주요 로직과 알고리즘은 다음과 같습니다:

  • 핵심 알고리즘: 깊이 우선 탐색(DFS)을 사용하여 한 번 탐색으로 하나의 연결 요소를 완전히 방문합니다.
  • 구현 세부사항:
    • adj[node]: 각 정점에 연결된 인접 리스트를 저장합니다.
    • visited[node]: 정점 방문 여부를 기록합니다.
    • DFS 수행 시 새로운 연결 요소를 발견하면 components를 증가시킵니다.
  • 시간 복잡도 분석:
    • DFS 수행: O(V + E) (V는 정점의 개수, E는 간선의 개수)
    • 전체 시간 복잡도: O(V + E)

결과

코드는 입력된 그래프의 연결 요소를 효율적으로 계산하며, 그래프가 클 경우에도 적절히 작동합니다. DFS를 활용하여 O(V + E)의 시간 복잡도를 유지하며 문제를 해결합니다.

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST