给你一个整数 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
不存在重复的边
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-the-number-of-complete-components
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种思路:
纯模拟建图,找出跟每个点联通的所有点,判断所有相连点是否相同。
比如对于输入:n = 6, edges = [[0,1],[0,2],[1,2],[3,4],[3,5]]
0 的联通点有:0, 1, 2
1 的联通点有:0, 1, 2
2 的联通点有:0, 1, 2
所以0, 1, 2 完全联通
但是, 3的联通点是:4, 5。4的联通点只有4没有5,所以3,4,5不是连通分量
时间复杂度:O(E)+ O(N),每条边和每个点分别遍历一次
空间复杂度:O(max(E)) = O(N^2)
class Solution:
def countCompleteComponents(self, n: int, edges: List[List[int]]) -> int:
from collections import defaultdict
src2des = defaultdict(set)
res = 0
visited = set()
for edge in edges:
src, des = edge[0], edge[1]
src2des[src].add(des)
src2des[src].add(src)
src2des[des].add(src)
src2des[des].add(des)
for node in range(n):
if node not in visited:
connected = True
visited.add(node)
for connected_node in src2des[node]:
visited.add(connected_node)
if src2des[connected_node] != src2des[node]:
connected = False
break
if connected:
res += 1
return res
第二种思路:
并查集也可以解决找连通分量的问题。
注意要维护每个分量里边的个数,来判断是不是全连通。
以后有空再实现。