# 2685. Count the Number of Complete Components

## Description

You are given an integer n. There is an undirected graph with n vertices, numbered from 0 to n - 1. You are given a 2D integer array edges where edges[i] = [ai, bi] denotes that there exists an undirected edge connecting vertices ai and bi.

Return the number of complete connected components of the graph.

A connected component is a subgraph of a graph in which there exists a path between any two vertices, and no vertex of the subgraph shares an edge with a vertex outside of the subgraph.

A connected component is said to be complete if there exists an edge between every pair of its vertices.

Example 1: Input: n = 6, edges = [[0,1],[0,2],[1,2],[3,4]]
Output: 3
Explanation: From the picture above, one can see that all of the components of this graph are complete.


Example 2: Input: n = 6, edges = [[0,1],[0,2],[1,2],[3,4],[3,5]]
Output: 1
Explanation: The component containing vertices 0, 1, and 2 is complete since there is an edge between every pair of two vertices. On the other hand, the component containing vertices 3, 4, and 5 is not complete since there is no edge between vertices 4 and 5. Thus, the number of complete components in this graph is 1.


Constraints:

• 1 <= n <= 50
• 0 <= edges.length <= n * (n - 1) / 2
• edges[i].length == 2
• 0 <= ai, bi <= n - 1
• ai != bi
• There are no repeated edges.

## Solutions

• class Solution {
private List<Integer>[] g;
private boolean[] vis;

public int countCompleteComponents(int n, int[][] edges) {
g = new List[n];
vis = new boolean[n];
Arrays.setAll(g, k -> new ArrayList<>());
for (int[] e : edges) {
int a = e, b = e;
}
int ans = 0;
for (int i = 0; i < n; ++i) {
if (!vis[i]) {
int[] t = dfs(i);
if (t * (t - 1) == t) {
++ans;
}
}
}
return ans;
}

private int[] dfs(int i) {
vis[i] = true;
int x = 1, y = g[i].size();
for (int j : g[i]) {
if (!vis[j]) {
int[] t = dfs(j);
x += t;
y += t;
}
}
return new int[] {x, y};
}
}

• class Solution {
public:
int countCompleteComponents(int n, vector<vector<int>>& edges) {
vector<vector<int>> g(n);
bool vis[n];
memset(vis, false, sizeof(vis));
for (auto& e : edges) {
int a = e, b = e;
g[a].push_back(b);
g[b].push_back(a);
}
function<pair<int, int>(int)> dfs = [&](int i) -> pair<int, int> {
vis[i] = true;
int x = 1, y = g[i].size();
for (int j : g[i]) {
if (!vis[j]) {
auto [a, b] = dfs(j);
x += a;
y += b;
}
}
return make_pair(x, y);
};
int ans = 0;
for (int i = 0; i < n; ++i) {
if (!vis[i]) {
auto [a, b] = dfs(i);
if (a * (a - 1) == b) {
++ans;
}
}
}
return ans;
}
};

• class Solution:
def countCompleteComponents(self, n: int, edges: List[List[int]]) -> int:
def dfs(i: int) -> (int, int):
vis[i] = True
x, y = 1, len(g[i])
for j in g[i]:
if not vis[j]:
a, b = dfs(j)
x += a
y += b
return x, y

g = defaultdict(list)
for a, b in edges:
g[a].append(b)
g[b].append(a)
vis = [False] * n
ans = 0
for i in range(n):
if not vis[i]:
a, b = dfs(i)
ans += a * (a - 1) == b
return ans


• func countCompleteComponents(n int, edges [][]int) (ans int) {
g := make([][]int, n)
vis := make([]bool, n)
for _, e := range edges {
a, b := e, e
g[a] = append(g[a], b)
g[b] = append(g[b], a)
}
var dfs func(int) (int, int)
dfs = func(i int) (int, int) {
vis[i] = true
x, y := 1, len(g[i])
for _, j := range g[i] {
if !vis[j] {
a, b := dfs(j)
x += a
y += b
}
}
return x, y
}
for i := range vis {
if !vis[i] {
a, b := dfs(i)
if a*(a-1) == b {
ans++
}
}
}
return
}