算法 - 图论05(Swift版本)

3 阅读1分钟

并查集理论基础知识

并查集被用来解决连通性问题, 可以用下面的题目来理解这句话。
换另外一种易理解的说法:解决的是判断两个元素是否在同一集合中的问题。

题目1:1971. 寻找图中是否存在路径

讲解

将图中的每个强连通分量视为一个集合,强连通分量中任意两点均可达,如果两个点 source 和 destination 处在同一个强连通分量中,则两点一定可连通,因此连通性问题可以使用并查集解决。

class Solution {
    func validPath(_ n: Int, _ edges: [[Int]], _ source: Int, _ destination: Int) -> Bool {
        // 并查集

        var parent = Array(repeating: 0, count: n)
        for i in 0..<n {
            parent[i] = i
        }
        func findRoot(_ u: Int) -> Int {
            if u == parent[u] { return u }
            parent[u] = findRoot(parent[u])
            return parent[u]
        }
        func join(_ u: Int, _ v: Int) {
            let u = findRoot(u)
            let v = findRoot(v)
            if u == v { return }
            parent[v] = u
        }
        func isSame(_ u: Int, _ v: Int) -> Bool {
            findRoot(u) == findRoot(v)
        }
        for line in edges {
            join(line[0], line[1])
        }
        return isSame(source, destination)
    }
}