노드별로 거리를 계산하고
서로가 통신거리 이내에 있는 노드라면 두 노드를 이어준다( = adj 에 추가한다)
그 후 모든 노드가 탐색될 때 까지 BFS탐색을 여러번 진행하면서
그래프가 몇개 있는지 계산한다.
#define getDist(x0,y0,x1,y1) ((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1))
#define dbl(r) (r*r)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int testcases;
int N;
int enemy[3001][3];
bool isVisit[3001];
int enemyNum;
int adj[3001][3001];
int adjSize[3001];
int main() {
cin >> testcases;
while (testcases--) {
enemyNum = 0;
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < 3; j++) {
cin >> enemy[i][j];
}
isVisit[i] = false;
adjSize[i] = 0;
for (int j = 0; j < N; j++) {
adj[i][j] = -1;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) continue;
int dist = getDist(enemy[i][0], enemy[i][1], enemy[j][0], enemy[j][1]);
int bound = dbl((enemy[i][2] + enemy[j][2]));
if (dist <= bound ){
adj[i][adjSize[i]] = j;
adj[j][adjSize[j]] = i;
adjSize[i]++;
adjSize[j]++;
}
}
}
for (int i = 0; i < N; i++) {
if (!isVisit[i]) {
enemyNum++;
queue<int> bfs;
bfs.push(i);
while (!bfs.empty()) {
int now = bfs.front();
bfs.pop();
for (int iter = 0; iter < adjSize[now]; iter++) {
int next = adj[now][iter];
if (!isVisit[next]) {
bfs.push(next);
isVisit[next] = true;
}
}
}
}
}
cout << enemyNum << endl;
}
return 0;
}
'코딩 > 알고리즘' 카테고리의 다른 글
백준 1325 효율적인 해킹 (0) | 2018.01.03 |
---|---|
백준 1890 점프 (0) | 2018.01.02 |
백준 2667 단지번호 붙이기 (0) | 2018.01.02 |
[python3] 백준 2739 구구단 숏코딩 (0) | 2018.01.01 |
백준 2606 바이러스 (0) | 2018.01.01 |