2025-03-22 Daily Challenge

Today I have done leetcode's March LeetCoding Challenge with cpp.

March LeetCoding Challenge 22

Description

Count the Number of Complete Components

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.

Solution

struct UnionSet {
  vector<int> parent;
public:
  UnionSet(int size): parent(size) {
    iota(parent.begin(), parent.end(), 0);
  }

  int find(int x) {
    if(parent[x] != x) parent[x] = find(parent[x]);
    return parent[x];
  }

  void merge(int x, int y) {
    x = find(x);
    y = find(y);
    parent[x] = y;
  }
};
class Solution {
public:
  int countCompleteComponents(int n, vector<vector<int>>& edges) {
    UnionSet us(n);
    for(auto &e : edges) {
      us.merge(e[0], e[1]);
    }
    map<int, int> edgeOfComponent;
    map<int, set<int>> vertexOfComponent;
    for(int i = 0; i < n; ++i) {
      vertexOfComponent[us.find(i)].insert(i);
    }
    for(auto &e : edges) {
      edgeOfComponent[us.find(e[0])] += 1;
    }
    int answer = 0;
    for(auto [root, vertices] : vertexOfComponent) {
      int verticesCount = vertices.size();
      answer += (verticesCount * (verticesCount - 1) / 2 == edgeOfComponent[root]);
    }
    return answer;
  }
};

// Accepted
// 3355/3355 cases passed (65 ms)
// Your runtime beats 41.32 % of cpp submissions
// Your memory usage beats 67.11 % of cpp submissions (129.4 MB)