## Question

You have a graph of `n`

nodes. You are given an integer `n`

and an array `edges`

where `edges[i] = [ai, bi]`

indicates that there is an edge between `ai`

and `bi`

in the graph.

Return *the number of connected components in the graph*.

## Algorithm

Typical question we could utilize union find.

At first, we let count = n, where all the nodes represent a tree(component), and then by doing union we could put connected nodes into same group(tree) and count minus one. Finally when all the nodes are union, the count number is the component number, in other words, the disconnected set(tree) number.

## Code

class Solution { int[] parents; int count; public int countComponents(int n, int[][] edges) { parents = new int[n]; count = n; for (int i = 0; i < n; i++) { parents[i] = i; } for (int[] edge : edges) { union(edge[0], edge[1]); } return count; } private int find(int x) { if (x != parents[x]) { parents[x] = find(parents[x]); } return parents[x]; } private void union(int x, int y) { int xRoot = find(x); int yRoot = find(y); if (xRoot == yRoot) { return; } parents[yRoot] = xRoot; count--; } }