반응형
https://www.acmicpc.net/problem/15789
15789번: CTP 왕국은 한솔 왕국을 이길 수 있을까?
입력의 첫째 줄에 왕국의 수 N(3 ≤ N ≤ 100,000)과 동맹 관계의 수 M(1 ≤ M ≤ 200,000)이 주어진다. 이 후 M개의 줄에 X,Y가 주어진다. 이는 X 왕국과 Y 왕국이 동맹이라는 뜻이다. 입력의 마지막 줄에 CT
www.acmicpc.net
[ 문제풀이 ]
1. 부모 노드를 저장할 vect 배열을 선언합니다.
2. vect[ i ] = i 로 초기화합니다.
3. Union-Find를 활용하여 왕국을 이어주고, 이을 때마다 power 배열에 값을 경신해 줍니다.
4. for문을 통해 1부터 N까지 돌면서 CTP 왕국이나 한솔 왕국에 속하지 않은 왕국들의 동맹국들의 수를 ans 배열에 저장합니다.
5. ans 배열을 내림차순으로 정렬하고, K개까지 동맹국을 더해줍니다.
6. 그 결과를 출력합니다.
[ 소스코드 ]
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<vector> #include<algorithm> using namespace std; int N, M; int vect[100001]; int power[100001]; int visited[100001]; vector<int> ans; int Find(int num) { if (vect[num] == num) return num; return vect[num] = Find(vect[num]); } void Union(int a, int b) { int pa = Find(a); int pb = Find(b); vect[pb] = pa; power[pa] += power[pb]; } int main() { scanf("%d %d", &N, &M); for (int i = 1; i <= N; i++) { vect[i] = i; power[i] = 1; } for (int i = 0; i < M; i++) { int X, Y; scanf("%d %d", &X, &Y); if (Find(X) != Find(Y)) { Union(X, Y); } } int C, H, K; scanf("%d %d %d", &C, &H, &K); int cnt = 0; if (K) { for (int i = 1; i <= N; i++) { int temp = Find(i); if ((Find(C) != temp) && (temp != Find(H))) { if (visited[temp] == 0) { visited[temp] = 1; ans.push_back({ power[temp] }); } } } } sort(ans.begin(), ans.end(), greater<>()); int temp = power[Find(C)]; for (int i = 0; i < min((int)ans.size(), K); i++) { temp += ans[i]; } printf("%d", temp); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 16168번 - 퍼레이드 (C++) (0) | 2023.06.05 |
---|---|
[ 백준 ] 12893번 - 적의 적 (C++) (0) | 2023.06.04 |
[ 백준 ] 17022번 - Sleepy Cow Sorting (C++) (0) | 2023.06.02 |
[ 백준 ] 14595번 - 동방 프로젝트 (Large) (C++) (0) | 2023.06.01 |
[ 백준 ] 20955번 - 민서의 응급 수술 (C++) (0) | 2023.05.31 |