-
반응형
https://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
-풀이-
UNION&FIND 알고리즘을 이용하여, 입력받은 간선들을 이용하여 자신의 최고 조상을 설정한다.
그런뒤 마지막으로, 최고조상의 개수만 세어주면, 연결요소의 개수를 셀 수 있다.
-시간-
Union Find 함수는 O(LogN)시간이 걸리는데, 초기화는 O(N)시간이 걸리므로, 총 O(N)이 된다.
-코드-
#include<iostream> #include<algorithm> #include<vector> using namespace std; int parent[1001]; int find(int a) { if (a == parent[a]) { return a; } return find(parent[a]); } void union_parent(int a, int b) { a = find(a); b = find(b); if (a < b) { parent[b] = a; } else { parent[a] = b; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { parent[i] = i; } for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; union_parent(a, b); } int cnt = 0; for (int i = 1; i <= n; i++) { if (i == parent[i]) { cnt++; } } cout << cnt << "\n"; return 0; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 7662번 이중 우선순위 큐 (0) 2021.06.02 [백준OJ] 17219번 비밀번호 찾기 (0) 2021.05.29 [백준OJ] 1439번 뒤집기 (0) 2021.05.21 [백준OJ] 9007번 카누 선수 (0) 2021.05.20 [백준OJ] 2268번 수들의 합 (0) 2021.05.19 댓글