算法学习——带权并查集dls版本

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

有的题目相出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];//不能颠倒顺序,先维护距离再移动根 }

__EOF__

本文作者爱飞鱼
本文链接https://www.cnblogs.com/mathiter/p/17891520.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   potential-star  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示