[Java] Easy and intuitive with explaination || Graph || DFS || Geometry
\nclass Solution {\n    /*\n    Make directed graph\n    u -> v means, v is in the range of u\n    check from which node maximum nodes can be reached and return
```\nclass Solution {\n    /*\n    Make directed graph\n    u -> v means, v is in the range of u\n    check from which node maximum nodes can be reached and return the number of nodes reached\n    */\n    public int maximumDetonation(int[][] bombs) {\n        Map<Integer, List<Integer>> graph = new HashMap<>();\n    \n        int n = bombs.length;\n        for(int i = 0; i< n; i++){\n            graph.put(i, new ArrayList<>());\n            for(int j = 0; j< n; j++){\n                if(i == j) continue;\n                if(inRange(bombs[i], bombs[j]))\n                    graph.get(i).add(j);\n            }\n        }\n        \n        int max = 0;\n        for(int i = 0; i< n; i++){\n            max = Math.max(max, dfs(i, graph, new HashSet<>()));\n        }\n        return max;\n    }\n    \n    private boolean inRange(int[] u, int[] v){\n        // (x-a)^2 + (y-b)^2 = R^2 -> point (a, b) is at border\n        // (x-a)^2 + (y-b)^2 < R^2 -> point (a, b) is inside the circle\n        // (x-a)^2 + (y-b)^2 > R^2 -> point (a, b) is outside the circle\n        return Math.pow(u[0]-v[0], 2) + Math.pow(u[1]-v[1], 2) <= Math.pow(u[2], 2);\n    }\n    \n    private int dfs(int node, Map<Integer, List<Integer>> graph, Set<Integer> visited){\n        if(visited.contains(node)) return 0;\n        visited.add(node);\n        int res = 0;\n        for(int neigh: graph.get(node)){\n            res += dfs(neigh, graph, visited);\n        }\n        return res + 1;\n    }\n}\n```
['Depth-First Search', 'Graph', 'Java']