https://www.acmicpc.net/problem/15789
문제
링크 참조
입력
입력의 첫째 줄에 왕국의 수 N(3 ≤ N ≤ 100,000)과 동맹 관계의 수 M(1 ≤ M ≤ 200,000)이 주어진다. 이 후 M개의 줄에 X,Y가 주어진다. 이는 X 왕국과 Y 왕국이 동맹이라는 뜻이다.
입력의 마지막 줄에 CTP 왕국의 번호 C와 한솔 왕국의 번호 H와 추가 동맹의 기회 K(0 ≤ K ≤ 100)가 공백으로 구분되어 주어진다.
주어지는 입력에서 CTP 왕국과 한솔 왕국은 절대로 동맹이 되지 않게 주어진다.
출력
CTP 왕국의 힘의 최대값을 출력
접근
Disjoint-set과 Max heap을 활용
C++ Code
using namespace std;
int n, m;
int x, y;
int c, h, k;
int p[100001] = { 0, };
int cnt[100001] = { 0, };
bool pushed[100001] = { false, };
void init(int n) {
for (int i = 1; i <= n; i++) {
p[i] = i;
cnt[i] = 1;
}
}
int parent(int who) {
if (p[who] == who) {
return who;
}
return p[who] = parent(p[who]);
}
void join(int a, int b) {
int pa = parent(a);
int pb = parent(b);
if (cnt[pa] >= cnt[pb]) {
p[pb] = pa;
cnt[pa] += cnt[pb];
}
else {
p[pa] = pb;
cnt[pb] += cnt[pa];
}
}
int main() {
scanf("%d %d", &n, &m);
init(n);
while (m--) {
scanf("%d %d", &x, &y);
if (parent(x) != parent(y)) {
join(x, y);
}
}
scanf("%d %d %d", &c, &h, &k);
int pc = parent(c);
int ph = parent(h);
priority_queue<int> pq;
for (int i = 1; i <= n; i++) {
int temp = parent(i);
if (!pushed[temp] && temp != ph && temp != pc) {
pq.push(cnt[temp]);
pushed[temp] = true;
}
}
while (k--) {
int temp = pq.top();
pq.pop();
cnt[pc] += temp;
}
printf("%d", cnt[pc]);
return 0;
}
'아카이빙 > BOJ' 카테고리의 다른 글
백준 11778번 - 피보나치 수와 최대공약수 (0) | 2018.10.21 |
---|---|
백준 2143번 - 두 배열의 합 (0) | 2018.10.21 |
백준 14728번 - 벼락치기 (0) | 2017.09.26 |
백준 14501번 - 퇴사 (0) | 2017.09.06 |
백준 11657번 - 타임머신 (0) | 2017.09.06 |