Count the Number of Complete Components

medium graph dfs union find

Problem

Given an undirected graph with n nodes and edge list edges, a connected component is "complete" iff every pair of its nodes is directly connected. Return the number of complete connected components.

Inputn = 6, edges = [[0,1],[0,2],[1,2],[3,4]]
Output3
Component {0,1,2} has 3 edges = C(3,2). Component {3,4} has 1 edge = C(2,2). Singleton {5} trivially complete. Total = 3.

def count_complete_components(n, edges):
    adj = [[] for _ in range(n)]
    for u, v in edges:
        adj[u].append(v); adj[v].append(u)
    seen = [False] * n
    ans = 0
    for s in range(n):
        if seen[s]: continue
        stack = [s]
        seen[s] = True
        verts, edeg = 0, 0
        while stack:
            u = stack.pop()
            verts += 1
            edeg += len(adj[u])
            for v in adj[u]:
                if not seen[v]:
                    seen[v] = True
                    stack.append(v)
        if edeg == verts * (verts - 1):
            ans += 1
    return ans
function countCompleteComponents(n, edges) {
  const adj = Array.from({ length: n }, () => []);
  for (const [u, v] of edges) { adj[u].push(v); adj[v].push(u); }
  const seen = new Array(n).fill(false);
  let ans = 0;
  for (let s = 0; s < n; s++) {
    if (seen[s]) continue;
    const stack = [s]; seen[s] = true;
    let verts = 0, edeg = 0;
    while (stack.length) {
      const u = stack.pop();
      verts++;
      edeg += adj[u].length;
      for (const v of adj[u]) {
        if (!seen[v]) { seen[v] = true; stack.push(v); }
      }
    }
    if (edeg === verts * (verts - 1)) ans++;
  }
  return ans;
}
class Solution {
    public int countCompleteComponents(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[] seen = new boolean[n];
        int ans = 0;
        for (int s = 0; s < n; s++) {
            if (seen[s]) continue;
            Deque<Integer> stack = new ArrayDeque<>();
            stack.push(s); seen[s] = true;
            int verts = 0, edeg = 0;
            while (!stack.isEmpty()) {
                int u = stack.pop();
                verts++;
                edeg += adj.get(u).size();
                for (int v : adj.get(u)) {
                    if (!seen[v]) { seen[v] = true; stack.push(v); }
                }
            }
            if (edeg == verts * (verts - 1)) ans++;
        }
        return ans;
    }
}
int countCompleteComponents(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> seen(n, false);
    int ans = 0;
    for (int s = 0; s < n; s++) {
        if (seen[s]) continue;
        stack<int> st; st.push(s); seen[s] = true;
        int verts = 0, edeg = 0;
        while (!st.empty()) {
            int u = st.top(); st.pop();
            verts++;
            edeg += adj[u].size();
            for (int v : adj[u]) {
                if (!seen[v]) { seen[v] = true; st.push(v); }
            }
        }
        if (edeg == verts * (verts - 1)) ans++;
    }
    return ans;
}
Time: O(V + E) Space: O(V + E)