【408DS算法题】041进阶-并查集基本操作

Index

    • 题目
    • 分析实现
    • 总结

题目

编写函数,实现并查集的基本操作(查找、合并)。

分析实现

并查集中包含数据结构parent数组,存储每个结点的父结点。

对于查找操作,可以通过递归找到当前结点的根结点,然后进行路径压缩——令当前结点的父结点为根节点,最后返回根节点。

对于合并操作,只需要将两节点的根结点进行合并即可。

具体实现如下:

class UnionFind {
private:
    vector<int> parent;

public:
    UnionFind(int n) {
    	// 构造函数,对parent数组进行初始化
        parent.resize(n);
        for (int i = 0; i < n; ++i) {
            parent[i] = i;
        }
    }

    // 查找操作,带路径压缩
    int find(int x) {
    	// 当前结点就是根节点
        if(parent[x]==x){
            return x;
        }
		// 当前结点不是根节点 - find(parent[x])找到根节点,赋值于parent[x]进行路径压缩,并返回根节点
		else{
            return parent[x] = find(parent[x]);
        }
    }

    // 合并操作
    void unionSets(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            parent[rootX] = rootY;
        }
    }
};

总结

以上就是并查集的查找和合并操作的实现。

此处的重点在于理解find函数路径压缩操作和具体的实现方法。

而合并操作还可以继续优化——按秩合并,此处不再过多介绍。

你可能感兴趣的:(算法,数据结构)