연결 요소의 개수
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
예제 입력 1
6 5
1 2
2 5
5 1
3 4
4 6
예제 출력 1
2
예제 입력 2
6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3
예제 출력 2
1
풀이 과정
연결 요소는 간단 하게 설명하자면 예제 1번의 입력대로 그래프를 만들면 밑의 그림처럼 된다.
1, 2, 5가 한 파티션이고 3, 4, 6이 한 파티션이다.
이 파티션의 개수가 연결 요소의 개수이다.
따라서 이 그래프의 연결 요소는 2개이다.
자세한 설명은 ratsgo님 블로그에 connect component를 찾아보면 된다.
https://ratsgo.github.io/data%20structure&algorithm/2017/11/24/CC/
연결요소 · ratsgo's blog
이번 글에서는 그래프(Graph)의 연결요소(Connected Components)를 찾아내는 기법을 살펴보도록 하겠습니다. 이 글은 고려대 김황남 교수님 강의와 위키피디아를 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다. concept 연결요소란 원그래프 $G$ 가운데 노드와 엣지가 서로 겹치지 않는 부그래프이되, 부그래프 내 모든 노드쌍에 대해 경로가 존재하는 걸 가리킵니다. 연결요소를 구축하는 기법은 디스조인트 셋(Disjoint Set)으로 구현하
ratsgo.github.io
설명은 코드에 주석으로 달아놓았다.
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
31
32
33
34
35
36
37
38
39
40
|
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m, from, to, cnt;
vector<int> a[1005];
bool check[500005];
void dfs(int n) {
check[n] = true;
for (int j = 0; j < a[n].size(); j++) {
int x = a[n][j];
if (check[x] == false) dfs(x);
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d%d", &from, &to);
a[from].push_back(to);
a[to].push_back(from);
}
//dfs로 첫번째 정점부터 dfs를 시작한다.
//dfs가 한번 끝나면 한 파티션 안의 정점의 check[i]는 true가 된다.
//그래서 차례대로 check[i]의 false 유무를 확인하여
//false인 i를 다시 dfs를 통해 그 파티션 안의 정점을 확인해준다.
//그래서 dfs가 실행될 때마다 파티션이 하나씩 늘어나므로 cnt를 하나씩 늘려준다음 출력한다.
for (int i = 1; i <= n; i++) {
if (check[i] == false) {
dfs(i);
cnt++;
}
}
printf("%d", cnt);
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
[백준 / C++] 1707 - 이분 그래프 (1) | 2020.03.16 |
---|---|
[백준 / C++] 2751 - 수 정렬하기 2 (0) | 2020.03.15 |
[백준 / C++] 1260 - DFS와 BFS (0) | 2020.03.15 |
[백준 / C++] 13023 - ABCDE (0) | 2020.03.13 |
[백준 / C++] 9461 - 파도반 수열 (0) | 2020.03.12 |