int countComponents(int n, vector<vector<int>>& edges) {
vector<vector<bool>> matrix(n, vector<bool>(n, false));
for (auto& e : edges) {
matrix[e[0]][e[1]] = true;
matrix[e[1]][e[0]] = true;
}
vector<bool> visited(n, false);
function<void(int)> dfs = [&](int node) {
visited[node] = true;
for (int next = 0; next < n; next++) {
if (matrix[node][next] && !visited[next]) dfs(next);
}
};
int count = 0;
for (int node = 0; node < n; node++) {
if (!visited[node]) {
dfs(node);
count++;
}
}
return count;
}
public int countComponents(int n, int[][] edges) {
boolean[][] matrix = new boolean[n][n];
for (int[] e : edges) {
matrix[e[0]][e[1]] = true;
matrix[e[1]][e[0]] = true;
}
boolean[] visited = new boolean[n];
int count = 0;
for (int node = 0; node < n; node++) {
if (!visited[node]) {
dfs(matrix, visited, node);
count++;
}
}
return count;
}
private void dfs(boolean[][] matrix, boolean[] visited, int node) {
visited[node] = true;
for (int next = 0; next < matrix.length; next++) {
if (matrix[node][next] && !visited[next]) dfs(matrix, visited, next);
}
}
def count_components(n, edges):
matrix = [[False] * n for _ in range(n)]
for a, b in edges:
matrix[a][b] = True
matrix[b][a] = True
visited = [False] * n
def dfs(node):
visited[node] = True
for nxt in range(n):
if matrix[node][nxt] and not visited[nxt]: dfs(nxt)
count = 0
for node in range(n):
if not visited[node]:
dfs(node)
count += 1
return count
function countComponents(n: number, edges: number[][]): number {
const matrix: boolean[][] = Array.from({ length: n }, () => new Array<boolean>(n).fill(false));
for (const [a, b] of edges) {
matrix[a][b] = true;
matrix[b][a] = true;
}
const visited = new Array<boolean>(n).fill(false);
const dfs = (node: number): void => {
visited[node] = true;
for (let next = 0; next < n; next++) {
if (matrix[node][next] && !visited[next]) dfs(next);
}
};
let count = 0;
for (let node = 0; node < n; node++) {
if (!visited[node]) {
dfs(node);
count++;
}
}
return count;
}
int countComponents(int n, vector<vector<int>>& edges) {
vector<vector<int>> adj(n);
for (auto& e : edges) {
adj[e[0]].push_back(e[1]);
adj[e[1]].push_back(e[0]);
}
vector<bool> visited(n, false);
int count = 0;
for (int start = 0; start < n; start++) {
if (visited[start]) continue;
count++;
visited[start] = true;
vector<int> queue = {start};
size_t head = 0;
while (head < queue.size()) {
int node = queue[head++];
for (int next : adj[node]) {
if (!visited[next]) {
visited[next] = true;
queue.push_back(next);
}
}
}
}
return count;
}
public int countComponents(int n, int[][] edges) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
for (int[] e : edges) {
adj.get(e[0]).add(e[1]);
adj.get(e[1]).add(e[0]);
}
boolean[] visited = new boolean[n];
int count = 0;
for (int start = 0; start < n; start++) {
if (visited[start]) continue;
count++;
visited[start] = true;
List<Integer> queue = new ArrayList<>(); queue.add(start);
int head = 0;
while (head < queue.size()) {
int node = queue.get(head++);
for (int next : adj.get(node)) {
if (!visited[next]) {
visited[next] = true;
queue.add(next);
}
}
}
}
return count;
}
def count_components(n, edges):
adj = [[] for _ in range(n)]
for a, b in edges:
adj[a].append(b)
adj[b].append(a)
visited = [False] * n
count = 0
for start in range(n):
if visited[start]: continue
count += 1
visited[start] = True
queue = [start]
head = 0
while head < len(queue):
node = queue[head]
head += 1
for nxt in adj[node]:
if not visited[nxt]:
visited[nxt] = True
queue.append(nxt)
return count
function countComponents(n: number, edges: number[][]): number {
const adj: number[][] = Array.from({ length: n }, () => []);
for (const [a, b] of edges) {
adj[a].push(b);
adj[b].push(a);
}
const visited = new Array<boolean>(n).fill(false);
let count = 0;
for (let start = 0; start < n; start++) {
if (visited[start]) continue;
count++;
visited[start] = true;
const queue: number[] = [start];
let head = 0;
while (head < queue.length) {
const node = queue[head++];
for (const next of adj[node]) {
if (!visited[next]) {
visited[next] = true;
queue.push(next);
}
}
}
}
return count;
}
int countComponents(int n, vector<vector<int>>& edges) {
vector<int> parent(n); iota(parent.begin(), parent.end(), 0);
function<int(int)> find = [&](int x) -> int {
return parent[x] == x ? x : (parent[x] = find(parent[x]));
};
int count = n;
for (auto& e : edges) {
int ra = find(e[0]), rb = find(e[1]);
if (ra != rb) {
parent[ra] = rb;
count--;
}
}
return count;
}
public int countComponents(int n, int[][] edges) {
int[] parent = new int[n];
for (int i = 0; i < n; i++) parent[i] = i;
int count = n;
for (int[] e : edges) {
int ra = find(parent, e[0]), rb = find(parent, e[1]);
if (ra != rb) {
parent[ra] = rb;
count--;
}
}
return count;
}
private int find(int[] parent, int x) {
if (parent[x] != x) parent[x] = find(parent, parent[x]);
return parent[x];
}
def count_components(n, edges):
parent = list(range(n))
def find(x):
if parent[x] != x: parent[x] = find(parent[x])
return parent[x]
count = n
for a, b in edges:
ra, rb = find(a), find(b)
if ra != rb:
parent[ra] = rb
count -= 1
return count
function countComponents(n: number, edges: number[][]): number {
const parent = Array.from({ length: n }, (_, i) => i);
const find = (x: number): number => (parent[x] === x ? x : (parent[x] = find(parent[x])));
let count = n;
for (const [a, b] of edges) {
const ra = find(a), rb = find(b);
if (ra !== rb) {
parent[ra] = rb;
count--;
}
}
return count;
}
int countComponents(int n, vector<vector<int>>& edges) {
vector<int> parent(n);
vector<int> size(n, 1);
for (int i = 0; i < n; i++) parent[i] = i;
auto find = [&](int x) {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
};
int count = n;
for (int i = 0; i < (int)edges.size() && count > 1; i++) {
int a = find(edges[i][0]), b = find(edges[i][1]);
if (a == b) continue;
if (size[a] < size[b]) swap(a, b);
parent[b] = a;
size[a] += size[b];
count--;
}
return count;
}
public int countComponents(int n, int[][] edges) {
int[] parent = new int[n];
int[] size = new int[n];
Arrays.fill(size, 1);
for (int i = 0; i < n; i++) parent[i] = i;
int count = n;
for (int i = 0; i < edges.length && count > 1; i++) {
int a = find(parent, edges[i][0]), b = find(parent, edges[i][1]);
if (a == b) continue;
if (size[a] < size[b]) { int t = a; a = b; b = t; }
parent[b] = a;
size[a] += size[b];
count--;
}
return count;
}
private int find(int[] parent, int x) {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
def count_components(n, edges):
parent = list(range(n))
size = [1] * n
def find(x):
while parent[x] != x:
parent[x] = parent[parent[x]]
x = parent[x]
return x
count = n
for i in range(len(edges)):
if count <= 1: break
a, b = find(edges[i][0]), find(edges[i][1])
if a == b: continue
if size[a] < size[b]: a, b = b, a
parent[b] = a
size[a] += size[b]
count -= 1
return count
function countComponents(n: number, edges: number[][]): number {
const parent = new Int32Array(n);
const size = new Int32Array(n).fill(1);
for (let i = 0; i < n; i++) parent[i] = i;
const find = (x: number): number => {
while (parent[x] !== x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
};
let count = n;
for (let i = 0; i < edges.length && count > 1; i++) {
let a = find(edges[i][0]), b = find(edges[i][1]);
if (a === b) continue;
if (size[a] < size[b]) [a, b] = [b, a];
parent[b] = a;
size[a] += size[b];
count--;
}
return count;
}