返回介绍

solution / 2600-2699 / 2685.Count the Number of Complete Components / README_EN

发布于 2024-06-17 01:03:01 字数 5878 浏览 0 评论 0 收藏 0

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

Solution 1

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
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[0], b = e[1];
      g[a].add(b);
      g[b].add(a);
    }
    int ans = 0;
    for (int i = 0; i < n; ++i) {
      if (!vis[i]) {
        int[] t = dfs(i);
        if (t[0] * (t[0] - 1) == t[1]) {
          ++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[0];
        y += t[1];
      }
    }
    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[0], b = e[1];
      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;
  }
};
func countCompleteComponents(n int, edges [][]int) (ans int) {
  g := make([][]int, n)
  vis := make([]bool, n)
  for _, e := range edges {
    a, b := e[0], e[1]
    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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文