어흥

[백준 10216] Count Circle Groups (C++) 본문

알고리즘/백준

[백준 10216] Count Circle Groups (C++)

라이언납시오 2020. 10. 20. 20:31
728x90
반응형

문제 링크: www.acmicpc.net/problem/10216

 

10216번: Count Circle Groups

백준이는 국방의 의무를 수행하기 위해 떠났다. 혹독한 훈련을 무사히 마치고 나서, 정말 잘 생겼고 코딩도 잘하는 백준은 그 특기를 살려 적군의 진영을 수학적으로 분석하는 일을 맡게 되었��

www.acmicpc.net

1. 주의할 점

- 유니온 파인드를 사용할 경우, 부모를 저장하는 Par[] 배열이 항상 갱신되도록 해야한다

- 사용하는 메모리들에 대한 초기화를 잘 한다

 

2. 구현

- 입력받음과 동시에 Par[] 배열을 초기화하며 입력받은 데이터들을 V벡터에 넣는다

- 각 통신탑과의 거리를 구하여 반지름의 합보다 작거나 같다면 같은 진영으로 판단 -> Make_union() 함수를 수행한다. N--한다. Make_union() 함수를 수행할 때, 부모 갱신시 조심한다

 

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct info {
	int x, y, r;
};
info tmp;
int num;
int par[3000];

int find_par(int x) {
	if (par[x] == x) return x;
	return par[x] = find_par(par[x]);
}

void make_union(int a, int b) {
	int pa = find_par(a);
	int pb = find_par(b);
	if (pa != pb) par[pa] = pb;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int test, x, y, r;
	cin >> test;
	for (int t = 0; t < test; t++) {
		vector<info> v;
		cin >> num;
		for (int i = 0; i < num; i++) {
			par[i] = i;
			cin >> x >> y >> r;
			tmp.x = x;
			tmp.y = y;
			tmp.r = r;
			v.push_back(tmp);
		}
		int result = num;
		for (int i = 0; i < num - 1; i++)
			for (int j = i + 1; j < num; j++) {
				int fx = v[i].x;
				int fy = v[i].y;
				int fr = v[i].r;
				int sx = v[j].x;
				int sy = v[j].y;
				int sr = v[j].r;
				long long d1 = (fr + sr)*(fr + sr);		//반지름 합
				long long d2 = (fx - sx)*(fx - sx) + (fy - sy)*(fy - sy);		//레이더 사이의 거리
				if (d1 >= d2 && find_par(i) != find_par(j)) {		//같은 그룹
					make_union(i, j);
					result--;
				}
			}
		cout << result << '\n';
	}
	return 0;
}

if (pa != pb) par[pa] = pb; 문장을 유의한다!!

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 13911] 집 구하기 (C++)  (0) 2020.10.29
[백준 1092] 배 (C++)  (4) 2020.10.26
[백준 3273] 두 수의 합 (C++)  (0) 2020.10.19
[백준 8911] 거북이 (C++)  (0) 2020.10.12
[백준 1965] 상자넣기 (C++)  (0) 2020.10.07
Comments