LC 1627. 带阈值的图连通性

https://leetcode-cn.com/problems/graph-connectivity-with-threshold/

之前没有遇到过这种需要计算多重连通性的问题,所以有点卡壳了。可以想象,这题使用使用 `gcd` 不断地去尝试所有连接点,然后再使用类似BFS/DFS来查找连通性,时间复杂度会很高。

有效解决多重连通性的一个思路就是使用Find/Union数据结构。可以想象,如果a<->b, b<->c的话,那么也说a<->c,而这个知识在Find/Union的时候就自动计算出来了。

具体到这道题目上,我们可以遍历所有 `pair(a,b) st. gcd(a, b>threshold` 。如果a<-b>, b<->c的话,那么在查询Find/Union数据结构的时候, a<->c这个关联就会存在了。

class Solution:
    def areConnected(self, n: int, threshold: int, queries: List[List[int]]) -> List[bool]:
        P = [-1] * (n + 1)

        def union(x, y):
            px = parent(x)
            py = parent(y)
            if px == py: return
            P[px] = py

        def parent(x):
            p = x
            while P[p] != -1:
                p = P[p]

            while x != p:
                x2 = P[x]
                P[x] = p
                x = x2
            return p

        ans = []
        if threshold == 0:
            ans.extend([True] * len(queries))
            return ans

        for x in range(threshold + 1, n + 1):
            for y in range(2, n // x + 1):
                union(x, x * y)

        for x, y in queries:
            px = parent(x)
            py = parent(y)
            ans.append(px == py)
        return ans