给定编号从 0
到 n-1
的 n
个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。
示例 1:
输入:n = 5
和edges = [[0, 1], [1, 2], [3, 4]]
0 3 | | 1 --- 2 4 输出: 2
示例 2:
输入:n = 5
和edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
0 4 | | 1 --- 2 --- 3 输出: 1
注意:
你可以假设在 edges
中不会出现重复的边。而且由于所以的边都是无向边,[0, 1]
与 [1, 0]
相同,所以它们不会同时在 edges
中出现。
思路:
并查集可以解决这种可以被抽象为找有几个不同的老大的问题。
开个并查集,然后把边union一下,最后输出count就好了……
class UnionFindSet(object):
def __init__(self, m):
# m, n = len(grid), len(grid[0])
self.roots = [i for i in range(m)]
self.rank = [0 for i in range(m)]
self.count = m
for i in range(m):
self.roots[i] = i
def find(self, member):
tmp = []
while member != self.roots[member]:
tmp.append(member)
member = self.roots[member]
for root in tmp:
self.roots[root] = member
return member
def union(self, p, q):
parentP = self.find(p)
parentQ = self.find(q)
if parentP != parentQ:
if self.rank[parentP] > self.rank[parentQ]:
self.roots[parentQ] = parentP
elif self.rank[parentP] < self.rank[parentQ]:
self.roots[parentP] = parentQ
else:
self.roots[parentQ] = parentP
self.rank[parentP] -= 1
self.count -= 1
class Solution(object):
def countComponents(self, n, edges):
"""
:type n: int
:type edges: List[List[int]]
:rtype: int
"""
ufs = UnionFindSet(n)
# print ufs.roots
for edge in edges:
start, end = edge[0], edge[1]
ufs.union(start, end)
return ufs.count