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