-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDivide_Nodes_Into_the_Maximum_Number_of_Groups.py
50 lines (40 loc) · 1.29 KB
/
Divide_Nodes_Into_the_Maximum_Number_of_Groups.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution:
def magnificentSets(self, n: int, edges: List[List[int]]) -> int:
UF = {}
def find(x):
if not x in UF:
UF[x] = x
if x != UF[x]:
UF[x] = find(UF[x])
return UF[x]
def union(x, y):
rootX = find(x)
rootY = find(y)
UF[rootX] = rootY
def BFS(node):
q = deque()
q.append((node, 1))
seen = {node: 1}
while q:
node, level = q.popleft()
for neighbor in graph[node]:
if not neighbor in seen:
seen[neighbor] = level + 1
q.append((neighbor, level + 1))
elif seen[neighbor] == level:
return -1
return level
graph = defaultdict(list)
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
union(u, v)
res = defaultdict(int)
for vertex in range(1, n + 1):
num_group = BFS(vertex)
if num_group == -1:
return -1
root = find(vertex)
res[root] = max(res[root], num_group)
# print(res, graph)
return sum(res.values())