class Solution {
public:
int countCompleteComponents(int n, vector<vector<int>>& edges) {
}
};
2685. 统计完全连通分量的数量
给你一个整数 n
。现有一个包含 n
个顶点的 无向 图,顶点按从 0
到 n - 1
编号。给你一个二维整数数组 edges
其中 edges[i] = [ai, bi]
表示顶点 ai
和 bi
之间存在一条 无向 边。
返回图中 完全连通分量 的数量。
如果在子图中任意两个顶点之间都存在路径,并且子图中没有任何一个顶点与子图外部的顶点共享边,则称其为 连通分量 。
如果连通分量中每对节点之间都存在一条边,则称其为 完全连通分量 。
示例 1:
输入:n = 6, edges = [[0,1],[0,2],[1,2],[3,4]] 输出:3 解释:如上图所示,可以看到此图所有分量都是完全连通分量。
示例 2:
输入:n = 6, edges = [[0,1],[0,2],[1,2],[3,4],[3,5]] 输出:1 解释:包含节点 0、1 和 2 的分量是完全连通分量,因为每对节点之间都存在一条边。 包含节点 3 、4 和 5 的分量不是完全连通分量,因为节点 4 和 5 之间不存在边。 因此,在图中完全连接分量的数量是 1 。
提示:
1 <= n <= 50
0 <= edges.length <= n * (n - 1) / 2
edges[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
原站题解
golang 解法, 执行用时: 84 ms, 内存消耗: 7.6 MB, 提交时间: 2023-05-23 09:58:08
func countCompleteComponents(n int, edges [][]int) (ans int) { g := make([][]int, n) for _, e := range edges { x, y := e[0], e[1] g[x] = append(g[x], y) g[y] = append(g[y], x) } vis := make([]bool, n) var v, e int var dfs func(int) dfs = func(x int) { vis[x] = true v++ e += len(g[x]) for _, y := range g[x] { if !vis[y] { dfs(y) } } } for i, b := range vis { if !b { v, e = 0, 0 dfs(i) if e == v*(v-1) { ans++ } } } return }
java 解法, 执行用时: 9 ms, 内存消耗: 42.8 MB, 提交时间: 2023-05-23 09:57:54
class Solution { private List<Integer>[] g; private boolean vis[]; private int v, e; public int countCompleteComponents(int n, int[][] edges) { g = new ArrayList[n]; Arrays.setAll(g, e -> new ArrayList<>()); for (var e : edges) { int x = e[0], y = e[1]; g[x].add(y); g[y].add(x); // 建图 } int ans = 0; vis = new boolean[n]; for (int i = 0; i < n; i++) { if (!vis[i]) { v = 0; e = 0; dfs(i); if (e == v * (v - 1)) ans++; } } return ans; } private void dfs(int x) { vis[x] = true; v++; e += g[x].size(); for (var y : g[x]) if (!vis[y]) dfs(y); } }
python3 解法, 执行用时: 104 ms, 内存消耗: 16.7 MB, 提交时间: 2023-05-23 09:57:37
''' dfs每个连通块,统计当前连通块的点数v和边数e. 每访问一个点,v+1;e加上v的邻居个数,注意这样一条边会统计两次。 在完全图中,任意两点之间都有边,相当于从v个点中选2个的方案数, 所以有e = v(v-1)/2.由于一条边统计了两次,所以判断条件e = v(v-1) ''' class Solution: def countCompleteComponents(self, n: int, edges: List[List[int]]) -> int: g = [[] for _ in range(n)] for x, y in edges: g[x].append(y) g[y].append(x) vis = [False] * n def dfs(x: int) -> None: vis[x] = True nonlocal v, e v += 1 e += len(g[x]) for y in g[x]: if not vis[y]: dfs(y) ans = 0 for i, b in enumerate(vis): if not b: v = e = 0 dfs(i) ans += e == v * (v - 1) return ans