并查集算法(union-find有关图的动态连通性)

并查集很巧妙的使用数组模拟了森林合并树的结构

初始化节点时同时记录每个节点的父节点(初始指向自己)

动态连通性实际上是一种等价关系
并查集中的连通满足三性质

  • 自反性,节点p和自己是连通的
  • 对称性,如果节点p和节点q是连通的,那么节点q和节点p也是连通的
    -传递性,如果节点p和q是连通,节点q和r连通,那么节点p和r也连通

并查集中实现三个功能:

  • 连接p和q union
  • 判断p和q是否连通 connected
  • 求图结构中的连通分量 count

实现并查集实现三个函数:find、union、connected

高度小的树接到大的树下面可以尽量保持树的平衡性(通过记录每个节点下面的节点个数实现),使得时间复杂度从O(N)降低到O(log(N)).

通过父子节点的迭代实现路径压缩

    while (parent[x] != x) 
        // 进行路径压缩
        parent[x] = parent[parent[x]]
        x = parent[x]
    }

调用find函数每次向树根遍历的同时,顺手将树高缩短了,最终所有树高都不会超过 3

很多实用dfs解决的问题都可以实用DFS解决.

你可能感兴趣的:(并查集算法(union-find有关图的动态连通性))