1
+ class SolutionDisjointSets :
2
+
3
+ class SolutionDFS :
4
+ def largestComponentSize (self , A : List [int ]) -> int :
5
+
6
+ self .vertices_count = len (A )
7
+
8
+ adjacency_list = self .build_graph (A )
9
+
10
+ return self .dfs (adjacency_list )
11
+
12
+ def build_graph (self , A : List [int ]) -> List [List [int ]]:
13
+
14
+ factors = dict ()
15
+
16
+ for n in A :
17
+ if n not in factors :
18
+ factors [n ] = set ()
19
+ self .get_factors (n , factors [n ])
20
+
21
+ adjacency_list = [[] for _ in range (self .vertices_count )]
22
+ for i in range (self .vertices_count ):
23
+ n = A [i ]
24
+ for j in range (i + 1 , self .vertices_count ):
25
+ m = A [j ]
26
+ if len (factors [n ].intersection (factors [m ])):
27
+ adjacency_list [i ].append (j )
28
+ adjacency_list [j ].append (i )
29
+
30
+ return adjacency_list
31
+
32
+ def get_factors (self , n , factors_set ):
33
+
34
+ factor = 2
35
+ while n >= factor * factor :
36
+ if n % factor == 0 :
37
+ factors_set .add (factor )
38
+ n //= factor
39
+ else :
40
+ factor += 1
41
+ factors_set .add (n )
42
+
43
+ def dfs (self , adjacency_list : List [List [int ]]) -> int :
44
+
45
+ visited = [False for _ in range (self .vertices_count )]
46
+
47
+ largest_component_size = 0
48
+ for u in range (self .vertices_count ):
49
+ if not visited [u ]:
50
+ largest_component_size = max (largest_component_size , self .explore (u , adjacency_list , visited ))
51
+
52
+ return largest_component_size
53
+
54
+ def explore (self , u , adjacency_list , visited ):
55
+ if visited [u ]:
56
+ return 0
57
+
58
+ size = 1
59
+ visited [u ] = True
60
+ for v in adjacency_list [u ]:
61
+ if not visited [v ]:
62
+ size += self .explore (v , adjacency_list , visited )
63
+
64
+ return size
0 commit comments