首页 > 其他分享 >带权并查集

带权并查集

时间:2023-12-09 21:33:45浏览次数:31  
标签:int 查集 带权 维护 root find

对于种类并查集主要是考虑清楚到根节点距离分为几类,每一类的意义

有的题目相出d数组的含义才能想到用带权并查集

//find函数需要变化
int find(int x)
{
    if (p[x] != x)
    {
        int root = find(p[x]);
        d[x] += d[p[x]];
        p[x] = root;
    }
    return p[x];
}

在查询过程中遇到两个不连通的点,需要合并操作,我们需要注意维护距离

if(find(l)!=find(r)){
//1.a[f[l]]=a[l]-d[l]2.a[f[r]]=a[r]-d[r]
//现在要维护的是d[f[l]];
//最终应该满足3.x=d[f[l]]=a[f[l]]-a[f[r]];
//4.a[j]-a[r]=x;
//将124代入3解得d[f[l]];
d[f[l]]=x-d[l]+d[r];
f[f[l]]=f[r];//不能颠倒顺序,先维护距离再移动根
}

标签:int,查集,带权,维护,root,find
From: https://www.cnblogs.com/mathiter/p/17891520.html

相关文章

  • 并查集基础版
    并查集(byd打到一半没保存直接关了乆乆乆)并查集是一种数据结构,它可以用一个优秀的时间复杂度(路径压缩后接近\(O(1)\))来维持多个集合之间的关系,并进行查找和合并。查找操作我们可以定义一个并查集数组\(p[i]=j\)表示\(i\)的父亲(并查集实际是把一个一个的集合看做树来处理)是\(j......
  • 不带权并查集——jly
    structDSU{vector<int>f,siz;DSU(){}DSU(intn){init(n);}voidinit(intn){f.resize(n);std::iota(f.begin(),f.end(),0);siz.assign(n,1);}intfind(intx){......
  • 第 132 场周赛——质数小结论,并查集配Floyd
    https://www.acwing.com/activity/content/competition/problem_list/3648/B题收获:1.利用题目告诉的结论:1e9范围质数之差小于3002.一个数不被2-a的任何数整除等价于他的最小质因子需要大于ac题:初步宏观思路:不难想到用并查集维护类别,只需将每一个类缩成一个点,由于最多只有500......
  • 并查集汇总
    并查集简介并查集是一种可以动态维护若干个不重叠的结合,并支持合并与查询的数据结构并查集是一种树状的数据结构,可以用于维护传递关系以及联通性。并查集有两种操作:find:查询一个元素属于哪个集合merge:合并两个集合模板find函数intfind(intx){ if(x==fa[x]) ret......
  • 【模板】并查集 (洛谷P3367)
    1#include<bits/stdc++.h>2usingnamespacestd;3template<classT>4inlinevoidread(T&s)5{6s=0;7intw=1;8charch=getchar();9while(ch<'0'||ch>'9')10{11......
  • 带权拟阵交
    '''cppinclude<bits/stdc++.h>includeusingnamespacestd;constintN=505;intn,m;map<int,vector<pair<int,int>>>E;map<int,int>limit;typedeflonglongll;structuni{intp[N];intcnt;voidinit(){......
  • 带权并查集
    很新奇啊这个东西。用来解决形如\(x_i-x_j=y\)系列方程组有无解的问题。思路很简单,\(dis_i\)代表从\(i\)的祖先与\(i\)之间的差值。这样能秒算出方程组中任意两个点的差值。本质是每次把两个方程组合并。找祖先部分:intfindpa(intx){ if(fa[x]!=x){ int......
  • 并查集学习笔记
    简介这里引用OI-wiki上的内容:并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。顾名思义,并查集支持两种操作:合并(Union):合并两个元素所属集合(合并对应的树)查询(Find):查询某个元素所属集合(查询对应的树的根节点),......
  • 并查集
    多少张桌子时间限制:2000/1000MS(Java/其他)内存限制:65536/32768K(Java/其他)问题描述今天是伊格内修斯的生日。他邀请了很多朋友。现在是晚餐时间。伊格内修斯想知道他至少需要多少张桌子。你必须注意,并不是所有的朋友都认识对方,所有的朋友都不想和陌生人呆在一起。这个问题的......
  • 并查集拓展——种类并查集&带权并查集
    在所面临的问题中,我们不仅需要知道两个元素之间是否存在关系,还需要记录其他要素,于是我们需要对原来的并查集进行拓展。种类并查集对于一般的并查集,只能表示“朋友的朋友就是朋友这种关系”,即我们只关系元素之间的连通性问题。但是对于“敌人的敌人就是朋友”这种关系则无能为力......