博客
关于我
poj1988(并查集)
阅读量:804 次
发布时间:2023-03-03

本文共 1323 字,大约阅读时间需要 4 分钟。

为了高效处理箱子合并和查询操作,我们采用并查集(Union-Find)结构。这个结构利用路径压缩和按秩合并,能够在合理时间内处理大量操作。

关键点总结:

  • 初始化

    • 每个箱子初始时为独立一列,父节点指向自身,子树大小为1。
  • 操作处理

    • M x y:将箱子x所在的列合并到箱子y所在的列上。找到x和y的根节点,若不同,合并后更新父节点和子树大小。
    • C x:查询箱子x下方的箱子数量。通过并查集找到x的根节点,计算子树大小减去x到根的距离再减一。
  • 并查集优化

    • 路径压缩:在查找操作中,压缩路径,使后续查询更快。
    • 按秩合并:合并时根据子树大小决定主树,避免小树合并到大树,减少操作次数。
  • 代码解析:

    #include 
    #define MAXN 30001using namespace std;int pre[MAXN], son[MAXN], vis[MAXN];int find(int x) { if (pre[x] == x) { return x; } int temp = pre[x]; pre[x] = find(pre[x]); vis[x] += vis[temp]; return pre[x];}void jion(int x, int y) { int px = find(x); int py = find(y); if (px != py) { pre[py] = px; vis[py] = son[px]; son[px] += son[py]; }}int main() { int p; scanf("%d", &p); for (int i = 1; i <= MAXN; ++i) { pre[i] = i; son[i] = 1; } for (int i = 1; i <= p; ++i) { char s[2]; int x, y; scanf("%s", s); if (s[0] == 'M') { scanf("%d%d", &x, &y); jion(x, y); } else { scanf("%d", &x); int root = find(x); printf("%d\n", son[root] - vis[x] - 1); } } return 0;}

    优化说明:

    • 路径压缩find函数通过递归更新每个节点的父节点和路径长度,确保后续查找更快。
    • 按秩合并:在合并时,子树较大的树作为主树,减少操作次数,提升效率。
    • 数据结构pre记录父节点,son记录子树大小,vis记录路径长度,有效维护并查集状态。

    这个方法高效处理了大规模数据,避免了直接模拟的复杂度,适合处理类似的问题。

    转载地址:http://cdxfk.baihongyu.com/

    你可能感兴趣的文章
    Python 中读取 CSV 文件-ChatGPT4o作答
    查看>>
    Python 之 filecmp
    查看>>
    python请求html_使用Python请求获取HTML?
    查看>>
    Python 之匿名函数和偏函数
    查看>>
    python 之栈的实现
    查看>>
    python语音播放
    查看>>
    python语言:装饰器原理
    查看>>
    Python 交互式数据可视化详解
    查看>>
    python语言有哪些优点和缺点_Python有哪些优缺点,你了解吗?
    查看>>
    Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
    查看>>
    Python 从数据库中存储和检索密码的最安全方法
    查看>>
    Python语言及其应用 - 知识点遍历
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>
    python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
    查看>>
    python 使用filetype校验文件
    查看>>
    Python 使用flush函数将缓冲区数据立即写磁盘
    查看>>
    python 使用in判断不准确,in不好使
    查看>>
    Python 使用pandas 进行查询和统计详解
    查看>>
    Redis 配置文件redis.conf详细解释
    查看>>