Tarjan's Algorithm to Find Articulation Points
We would utilise an exploreTime[] array to maintain the Minimum time it will require to explore any Vertex in our Graph.\nAt any given point if a Vertex is not 
We would utilise an `exploreTime[]` array to maintain the Minimum time it will require to explore any Vertex in our Graph.\nAt any given point if a Vertex is not being previously Explored & its neighbour exploreTime is greater than the current Vertex exploreTime, it implies this connection once removed will result in our **Strongly Connected Component** to Break. \n\nHere\'s a Good [Video](https://youtu.be/64KK9K4RpKE) explaining this.\n```\nclass Solution {\n    List<List<Integer>> ans;\n    int time = 0;\n    public List<List<Integer>> criticalConnections(int n, List<List<Integer>> connections) {\n        ans = new LinkedList();\n        int[] exploreTime = new int[n];\n        boolean[] visited = new boolean[n];\n        \n        List<Integer>[] graph = new LinkedList[n];\n        for(int i = 0; i < n; i++)\n            graph[i] = new LinkedList();\n        \n        for(List<Integer> edge: connections)\n        {\n            int a = edge.get(0);\n            int b = edge.get(1);\n            graph[a].add(b);\n            graph[b].add(a);\n        }\n        \n        dfs(graph, 0, visited, exploreTime, -1);\n        \n        return ans;\n    }\n    \n    private void dfs(List<Integer>[] graph, int vertex, boolean[] visited, int[] exploreTime, int prev)\n    {\n        visited[vertex] = true;\n        exploreTime[vertex] = time++;\n        int current = exploreTime[vertex];\n        \n        for(int neighbour : graph[vertex])\n        {\n            if(neighbour == prev) continue;\n            if(!visited[neighbour])\n                dfs(graph, neighbour, visited, exploreTime, vertex);\n            \n            exploreTime[vertex] = Math.min(exploreTime[vertex], exploreTime[neighbour]);\n            \n            if(current < exploreTime[neighbour])\n            {\n                ans.add(Arrays.asList(vertex, neighbour));\n            }\n        }\n    }\n}\n```
['Depth-First Search', 'Java']