여러 테스트케이스가 주어질때, vector의 resize함수를 호출한다고 vector안의 내용들이 초기화 되지는 않음에 유의하자!
항상 하나의 테스트케이스가 끝나면 vector clear함수를 호출하자!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <cmath> | |
#include <algorithm> | |
#include <queue> | |
#include <iostream> | |
#include <vector> | |
using namespace std; | |
struct circle{ | |
float x,y,r; | |
} typedef circle; | |
int N; | |
vector<vector<int>> map; | |
bool visited[5001]; | |
void bfs(int p){ | |
queue<int> que; | |
que.push(p); | |
visited[p] = true; | |
while (!que.empty()){ | |
int elem = que.front(); | |
que.pop(); | |
for (int i=0;i<map[elem].size();i++){ | |
if (visited[map[elem][i]] == false){ | |
que.push(map[elem][i]); | |
visited[map[elem][i]] = true; | |
} | |
} | |
} | |
} | |
int main() { | |
int T; | |
scanf("%d",&T); | |
while (T--){ | |
int N; | |
scanf("%d",&N); | |
for (int j=1;j<=N;j++) | |
visited[j] = false; | |
map.resize(N+1); | |
vector<circle> vec; | |
vec.resize(N+1); | |
for (int i=1;i<=N;i++){ | |
circle input; | |
int x,y,r; | |
scanf("%d %d %d",&x,&y,&r); | |
input.x = x; input.y = y; input.r = r; | |
vec[i] = input; | |
} | |
for (int i=1;i<N;i++){ | |
for (int j=i+1;j<=N;j++) | |
{ | |
double dist = sqrt(pow(vec[i].x - vec[j].x, 2) + pow(vec[i].y - vec[j].y, 2)); | |
if (dist <= vec[i].r+vec[j].r){ | |
map[i].push_back(j); | |
map[j].push_back(i); | |
} | |
} | |
} | |
int num = 0; | |
for (int i=1;i<=N;i++){ | |
if (!visited[i]){ | |
bfs(i); | |
num++; | |
} | |
} | |
map.clear(); | |
vec.clear(); | |
printf("%d\n",num); | |
} | |
} | |
댓글
댓글 쓰기