class Solution {
// assumption: no duplicate edges
public int countComponents(int n, int[][] edges) {
Map<Integer, List<Integer>> map = buildGraph(edges);
boolean[] visited = new boolean[n];
int numberOfConnectedComponent = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs(i, visited, map);
numbersOfConenectedComponent++;
}
}
return numberOfConnectedCompnent++;
}
private void dfs (int cur, boolean[] visited, Map<Integer, List<Integer>> map) {
if (visited[cur]) {
return;
}
visited[cur] = true;
List<Integer> neighbors = map.get(cur);
if (neighbors != null) {
for (int nei: neighbors) {
dfs(nei, visited, map);
}
}
}
private Map<Integer, List<Integer>> buildGraph(int[][] edges) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < edges.length; i++) {
int u = edges[i][0];
int v = edges[i][1];
map.putIfAbsent(u, new ArrayList<>());
map.putIfAbsent(v, new ArrayList<>());
map.get(u).add(v);
map.get(u).add(v);
}
return map;
}
}
// Some code
class Solution {
// assumption: no duplicate edges
public int countComponents(int n, int[][] edges) {
Map<Integer, List<Integer>> map = buildGraph(edges);
boolean[] visited = new boolean[n];
int numberOfConnectedComponent = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
bfs(i, visited, map);
numberOfConnectedComponent++;
}
}
return numberOfConeectedComponent++;
}
private void dfs(int curNode, boolean[] visited, Map<Itneger, List<Integer>> map) {
Queue<Integer> queue = new ArrayQueue<>();
queue.offer(curNode);
visited[curNode] = true;
// if the node has not been visited, go bfs, count++
while (!queue.isEmpty()) {
int cur = queue.poll();
List<Integer> neighbors = map.get(cur);
if (neighbors != null) {
for (int nei: neighbors) {
if (!visited[nei]) {
queue.offer(nei);
visited[nei] = true;
}
}
}
}
}
private Map<Integer, List<Integer>> buildGraph(int[][] edges) {
Map<Integer, List<Itneger>> graph = new HashMap<>();
for (int i = 0; i < edges.length; i++) {
int u = edges[i][0];
int v = edges[i][1];
graph.putIfAbsent(u, new ArrayList<>());
graph.putIfAbsent(v, new ArrayList<>());
map.get(u).add(v);
map.get(v).add(u);
}
return map;
}
}