并查集一般用于无向图中,其作用一般为两个:

  • 1 查看两个节点之间是否连通
  • 2 查看某个无向图是否有环

并查集的构建分为3个部分:

  • 1 init:为每一个节点初始化一个祖先,其默认值为自身。
  • 2 find:通过递归查找节点i的祖先节点,该过程通过压缩路径减少多层递归。
  • 3 join:将两个节点进行连通。

并查集检测两个节点是否连通的步骤(构建好无向图之后,再判断):

  • 1 init初始化无向图全部节点。
  • 2 使用join函数将无向图的边进行连通。
  • 3 使用find函数查看该两节点是否连通。

并查集检测无向图是否有环(构建过程中两条边的公共祖先节点相同则存在环)的步骤(构建无向图过程中,进行判断):

  • 1 init初始化无向图全部节点。
  • 2 在构建过程中使用使用find函数查看是否有公共祖节点,是则有环,如果无环则join函数将无向图的边进行连通。
    vector path;
    void init(int n)
    {
        for(int i=0; i<n; i++) path.push_back(i);
    }
    int find(int i)
    {
        if (path[i] == i) return i;
        else 
        {
// 不使用路径压缩,即为: return find(path[i]) path[i] = find(path[i]); return path[i]; } } void join(int i, int j) { int path_i = find(i); int path_j = find(j); path[path_i] = path_j; }