带权并查集算法教程

1 前言

参考博客: 并查集到带权并查集

       \space \space\space \space\space \space       我们为什么要学习带权并查集呢?我们知道,对于普通并查集而言,它反映的是集合与集合之间的关系(即元素是否处于这个集合),相当于是一个无权图,而集合内元素之间的关系并没有表明。如果我们一旦想体现出集合中元素之间的相互关系,即边权值,那么普通并查集必然不能实现,所以带权并查集就出来了。它不仅记录集合的关系,还记录着集合内元素的关系或者说是集合内元素连接线的权值。 这个本质实际上就是一个带权图。

       \space \space\space \space\space \space       那么,我们如何考虑权值呢?在普通并查集中只有两种操作,一种是路径压缩寻找根节点,一种是合并操作。 要知道,每个节点记录的是与父节点边的权值。那么在路径压缩过程中,我们对权值也应该进行相应的更新。因为在路径压缩之前,每个节点都是与其父节点链接着,那个权值自然也是与其父节点之间的权值,而路径压缩之后,父节点早已改变成根节点,这是我们最值得注意的一步操作,这也是带权并查集最难理解的地方。在合并操作中同样如此,我们需要将两个节点连接起来,那么一个节点的父节点自然改变了,我们同样也要进行权值更新。

       \space \space\space \space\space \space       所以我们需要在普通并查集的基础上添加一个 v a l u e value value数组来表示

2 路径压缩

这里我们如何更新权值呢?我们想想,我们在未进行路径压缩之前,是这样的一个情况: A − > B − > C − > D − > E A->B->C->D->E A>B>C>D>E假设 E E E就是根节点,我们需要从 A A A点开始进行路径压缩,而每个节点它们的权值只是到它们当前父节点的权值。 我们要的是每个节点的父节点都是根节点,那么权值也是与根节点的权值。故这里我们需要如何处理呢?我们看直接与根节点 E E E相连的 D D D点,这个 D D D点的权值自然是没有必要更新,就是 v a l u e [ D ] , value[D], value[D]那么 C C C点呢?它所要进行的更新操作是不是 v a l u e [ C ] = v a l u e [ C ] + v a l u e [ D ] value[C]=value[C]+value[D] value[C]=value[C]+value[D],而 B B B点呢?若 C C C点的权值已经更新,即说明 C C C点是与根节点 E E E相连,那么是不是也是一样的方法,直接加上上一个点的权值即可。所以我们发现了什么,这是一个递归的过程,先寻找到根节点,再回溯更新权值 和根节点。 故非递归版路径压缩在这里是不太好用的,我们使用递归版路径压缩。具体看代码。

int Find(int x){
	//这里要使用递归去更新带权值。
	if(x==father[x]){
		return x;
	}
	else{
		int temp=father[x];//记录原来父节点的编号。
		father[x]=Find(father[x]);//继续递归下去找到根节点,再回溯更新带权值,这个递归结束后说明value[x]已经是与根节点的权值了。
		value[x]+=value[temp];
		return father[x];//返回根节点。
	}
}

3 合并

已知x,y根节点分别为xRoot,yRoot,如果有了x、y之间的关系,合并如果不考虑权值直接修改father就行了,但是现在是带权并查集,必须得求出xRoot与yRoot这条边的权值是多少,很显然x到yRoot两条路径的权值之和应该相同,就不难得出上面代码所表达的更新式。我们来看几张图。

在这里插入图片描述
那么合并操作就很好写了,我们来看代码。

int xRoot = FindSet(x);
int yRoot = FindSet(y);
if (xRoot != yRoot){
	father[xRoot] = yRoot;
	value[xRoot] = -value[x] + value[y] + s;
}

这就是带权并查集,当然,用起来可并不是这么简单,我们怎么去表示这个权值这是一个问题,不要套模板,得用心去体会,才是解题之道。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用于打比赛的ACM算法模板 常用函数与STL 重要公式与定理 1. Fibonacci Number 2. Lucas Number 3. Catalan Number 4. Stirling Number(Second Kind) 5. Bell Number 6. Stirling's Approximation 7. Sum of Reciprocal Approximation 8. Young Tableau 9. 整数划分 10. 错排公式 11. 三角形内切圆半径公式 12. 三角形外接圆半径公式 13. 圆內接四边形面积公式 14. 基础数论公式 大数模板,字符读入 数论算法 1. Greatest Common Divisor最大公约数 2. Prime素数判断 3. Sieve Prime素数筛法 4. Module Inverse模逆元 5. Extended Euclid扩展欧几里德算法 6. Modular Linear Equation模线性方程(同余方程) 7. Chinese Remainder Theorem中国余数定理(互素于非互素) 8. Euler Function欧拉函数 9. Farey总数 9. Farey序列构造 10. Miller_Rabbin素数测试,Pollard_rho因式分解 图论算法 1. 最小生成树(Kruscal算法) 2. 最小生成树(Prim算法) 3. 单源最短路径(Bellman-ford算法) 4. 单源最短路径(Dijkstra算法) 5. 全源最短路径(Folyd算法) 6. 拓扑排序 7. 网络预流和最大流 8. 网络最小费用最大流 9. 网络最大流(高度标号预流推进) 10. 最大团 11. 二分图最大匹配(匈牙利算法) 12. 带权二分图最优匹配(KM算法) 13. 强连通分量(Kosaraju算法) 14. 强连通分量(Gabow算法) 15. 无向图割边割点和双连通分量 16. 最小树形图O(N^3) 17. 最小树形图O(VE) 几何算法 1. 几何模板 2. 球面上两点最短距离 3. 三点求圆心坐标 4. 三角形几个重要的点 专题讨论 1. 树状数组 2. 字典树 3. 后缀树 4. 线段树 5. 并查集 6. 二叉堆 7. 逆序数(归并排序) 8. 树状DP 9. 欧拉路 10. 八数码 11. 高斯消元法 12. 字符串匹配(KMP算法) 13. 全排列,全组合 14. 二维线段树 15. 稳定婚姻匹配 16. 后缀数组 17. 左偏树 18. 标准RMQ-ST 19. 度限制最小生成树 20. 最优比率生成树(0/1分数规划) 21. 最小花费置换 22. 区间K大数 23. LCA - RMQ-ST 24. LCA – Tarjan 25. 指数型母函数 26. 指数型母函数(大数据) 27. 单词前缀树(字典树+KMP) 28. FFT(大数乘法) 29. 二分图网络最大流最小割 30. 混合图欧拉回路 31. 无源汇上下界网络流 32. 二分图最小点权覆盖 33. 带约束的轨道计数(Burnside引理) 34. 三分法求函数波峰 35. 单词计数,矩阵乘法 36. 字符串和数值hash 37. 滚动队列,前向星表示法 38. 最小点基,最小权点基
ACM 算法模板集 Contents 一. 常用函数与STL 二. 重要公式与定理 1. Fibonacci Number 2. Lucas Number 3. Catalan Number 4. Stirling Number(Second Kind) 5. Bell Number 6. Stirling's Approximation 7. Sum of Reciprocal Approximation 8. Young Tableau 9. 整数划分 10. 错排公式 11. 三角形内切圆半径公式 12. 三角形外接圆半径公式 13. 圆內接四边形面积公式 14. 基础数论公式 三. 大数模板,字符读入 四. 数论算法 1. Greatest Common Divisor最大公约数 2. Prime素数判断 3. Sieve Prime素数筛法 4. Module Inverse模逆元 5. Extended Euclid扩展欧几里德算法 6. Modular Linear Equation模线性方程(同余方程) 7. Chinese Remainder Theorem中国余数定理(互素于非互素) 8. Euler Function欧拉函数 9. Farey总数 9. Farey序列构造 10. Miller_Rabbin素数测试,Pollard_rho因式分解 五. 图论算法 1. 最小生成树(Kruscal算法) 2. 最小生成树(Prim算法) 3. 单源最短路径(Bellman-ford算法) 4. 单源最短路径(Dijkstra算法) 5. 全源最短路径(Folyd算法) 6. 拓扑排序 7. 网络预流和最大流 8. 网络最小费用最大流 9. 网络最大流(高度标号预流推进) 10. 最大团 11. 二分图最大匹配(匈牙利算法) 12. 带权二分图最优匹配(KM算法) 13. 强连通分量(Kosaraju算法) 14. 强连通分量(Gabow算法) 15. 无向图割边割点和双连通分量 16. 最小树形图O(N^3) 17. 最小树形图O(VE) 六. 几何算法 1. 几何模板 2. 球面上两点最短距离 3. 三点求圆心坐标 4. 三角形几个重要的点 七. 专题讨论 1. 树状数组 2. 字典树 3. 后缀树 4. 线段树 5. 并查集 6. 二叉堆 7. 逆序数(归并排序) 8. 树状DP 9. 欧拉路 10. 八数码 11. 高斯消元法 12. 字符串匹配(KMP算法) 13. 全排列,全组合 14. 二维线段树 15. 稳定婚姻匹配 16. 后缀数组 17. 左偏树 18. 标准RMQ-ST 19. 度限制最小生成树 20. 最优比率生成树(0/1分数规划) 21. 最小花费置换 22. 区间K大数 23. LCA - RMQ-ST 24. LCA – Tarjan 25. 指数型母函数 26. 指数型母函数(大数据) 27. 单词前缀树(字典树+KMP) 28. FFT(大数乘法) 29. 二分图网络最大流最小割 30. 混合图欧拉回路 31. 无源汇上下界网络流 32. 二分图最小点权覆盖 33. 带约束的轨道计数(Burnside引理) 34. 三分法求函数波峰 35. 单词计数,矩阵乘法 36. 字符串和数值hash 37. 滚动队列,前向星表示法 38. 最小点基,最小权点基

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值