题目
Given a non-empty array of unique positive integers A, consider the following graph:
- There are A.length nodes, labelled A[0] to A[A.length - 1];
 - There is an edge between A[i] and A[j] if and only if A[i] and A[j] share a common factor greater than 1. Return the size of the largest connected component in the graph.
 
解题思路
对每个数进行质因数分解,之后使用并查集求连通分量,每次union这个数和它的所有质因子
代码
class Solution:
    def largestComponentSize(self, A: List[int]) -> int:
        def find(v):
            if parent[v] != v:
                parent[v] = find(parent[v])
            return parent[v]
        def union(v1, v2):
            p1 = find(v1)
            p2 = find(v2)
            if p1 not in rank:
                rank[p1] = 0
            if p2 not in rank:
                rank[p2] = 0
            if p1 != p2:
                if rank[p1] > rank[p2]:
                    parent[p2] = p1
                else:
                    parent[p1] = p2
                    if rank[p1] == rank[p2]:
                        rank[p2] += 1
                        
        def sieve(n):
            primes = [True] * (n + 1)
            p = 2
            while p * p <= n:
                if primes[p]:
                    for i in range(p * 2, n + 1, p):
                        primes[i] = False
                p += 1
            return [element for element in range(2, n) if primes[element]]
        rank = {}
        primes = sieve(max(A) // 2 + 1)
        parent = {i: i for i in A + primes}
        for num in A:
            up = int(sqrt(num))
            t = num
            for p in primes:
                if p > up:
                    break
                if num % p == 0:
                    union(num, p)
                while t % p == 0:
                    t //= p
            if t > 1:
                union(num, t)
        return max(Counter([find(n) for n in A]).values())