728x90
SMALL
백준 문제 풀이: 11724 [연결 요소의 개수]
문제 링크: https://www.acmicpc.net/problem/11724
문제 설명:
주어진 무방향 그래프에서 연결 요소의 개수를 구하는 문제입니다. 연결 요소란 서로 연결된 정점들의 최대 집합을 의미합니다.
입력:
- 첫째 줄에 정점의 개수
n
과 간선의 개수m
이 주어집니다. (1 ≤n
≤ 1,000, 0 ≤m
≤n*(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
'BAEKJOON > 그래프' 카테고리의 다른 글
백준 21736번 [헌내기는 친구가 필요해](C++) -yes6686- 티스토리 (0) | 2024.12.25 |
---|---|
백준 16928번 [뱀과 사다리 게임](C++) -yes6686- 티스토리 (0) | 2024.12.25 |
백준 11403번 [경로 찾기](C++) -yes6686- 티스토리 (0) | 2024.12.25 |
백준 7576번 [토마토](C++) -yes6686- 티스토리 (0) | 2024.12.24 |
백준 7569번 [토마토](C++) -yes6686- 티스토리 (0) | 2024.12.24 |