并查集模板类

cpp 复制代码
// 并查集模板
class UnionFind {
public:
    vector<int> parent;
    vector<int> size;
    int n;
    // 当前连通分量数目
    int setCount;
    
public:
    UnionFind(int _n): n(_n), setCount(_n), parent(_n), size(_n, 1) {
        iota(parent.begin(), parent.end(), 0);
    }
    
    int findset(int x) {
        return parent[x] == x ? x : parent[x] = findset(parent[x]);
    }
    
    bool unite(int x, int y) {
        x = findset(x);
        y = findset(y);
        if (x == y) {
            return false;
        }
        if (size[x] < size[y]) {
            swap(x, y);
        }
        parent[y] = x;
        size[x] += size[y];
        --setCount;
        return true;
    }
    
    bool connected(int x, int y) {
        x = findset(x);
        y = findset(y);
        return x == y;
    }
};

在这个模板中,有以下几个主要函数:

  1. UnionFind(int _n): 构造函数,用于初始化并查集,参数 _n 表示元素的个数。
  2. findset(int x): 查找元素 x 所属的集合的代表元素,这里使用了路径压缩的优化,可以减小查询时间。
  3. unite(int x, int y): 合并元素 xy 所属的集合,即将它们连接起来。如果 xy 已经在同一个集合中,则返回 false;否则返回 true,表示合并成功。
  4. connected(int x, int y): 判断元素 xy 是否属于同一个集合,即它们是否连接在一起。
cpp 复制代码
//用法
UnionFind uf(n);//初始化一个n个元素的并查集
uf.unite(x,y);//合并x和y这两个元素
uf.connected(x,y);//判断x和y这两个元素是否在同一个连通块
相关推荐
for_ever_love__15 小时前
移动应用开发实验室25级期末考核
c++
聆风吟º16 小时前
【顺序表习题|图解|双指针】移除元素 + 删除有序数组中的重复项
c语言·数据结构·c++·经验分享·算法
无心水16 小时前
【神经风格迁移:蒙德里安】12、语义感知的构图重构算法:让蒙德里安风格“理解“图像内容
算法·重构·vgg·信息智能化·csdn月度精选·ai原生架构·神经风格迁移:蒙德里安
Salt_072816 小时前
DAY33 类的装饰器
python·算法·机器学习
炽烈小老头16 小时前
【每天学习一点算法 2025/12/10】反转链表
学习·算法·链表
岁月蹉跎的一杯酒16 小时前
Clion opencv C++无法直接读取本地图像
c++·人工智能·opencv
学困昇16 小时前
Linux 进程概念与内存管理详解(含冯诺依曼体系结构、环境变量、调度算法)
linux·c语言·开发语言·网络·数据结构·c++
爱学习的小仙女!16 小时前
数据结构基本概念
数据结构
carver w16 小时前
open cv 基础操作合集 python
开发语言·c++
EXtreme3516 小时前
【数据结构】算法艺术:如何用两个栈(LIFO)优雅地模拟队列(FIFO)?
c语言·数据结构·算法·设计模式·栈与队列·摊还分析·算法艺术