public int maximumDetonation(int[][] bombs) {
int n = bombs.length;
List<Integer>[] G = new List[n];
for (int i = 0; i < n; i++) {
G[i] = new ArrayList<>();
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
long dist = ((long)bombs[i][0] - bombs[j][0]) * (bombs[i][0] - bombs[j][0]) + (bombs[i][1] - bombs[j][1]) * (bombs[i][1] - bombs[j][1]);
if ((long)bombs[i][2] * bombs[i][2] >= dist) {
G[i].add(j);
}
if ((long)bombs[j][2] * bombs[j][2] >= dist) {
G[j].add(i);
}
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans = Math.max(ans, bfs(G, i));
}
return ans;
}
private int bfs(List<Integer>[] G, int start) {
int n = G.length;
boolean[] marked = new boolean[n];
int ans = 0;
Queue<Integer> q = new LinkedList<>();
q.add(start);
marked[start] = true;
while (!q.isEmpty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
int v = q.poll();
ans++;
for (int w : G[v]) {
if (!marked[w]) {
marked[w] = true;
q.add(w);
}
}
}
}
return ans;
}