我对一类带权值的并查集的理解。 每个点对他父亲的边 就是链接这两点之间的关系。 通过这个关系 把所有的子节点都指向 最后的大根节点。
然后利用递归的形式,更新所有关系; 使原来 满足他父亲的关系的边,再转化到 大根节点的时候边的关系正确。
比如 A-> B-> C->D->E
现在只有 A->B B->C C->D D->E 的关系。
然后 通过C->D D->E 可知道 C->E 的关系。
然后 由 B->C C->E 可知道 B-> E 的关系;
然后 由A-> B B-> E 可知道 A-> E 的关系。
这样每个节点都指向 大根节点 E
对于两个并查集的合并 比如 有 A-> B A->F F->E 的关系 。 B 和E 都是并查集的大根节点 。
通过
A -> F
^ ^
| |
B E
这样就可以知道 B-> E的关系。
这个东西在张清泉 大牛的ppt 里面有详细的说明。 2010_bputacm_第一次交流_wolf5x.ppt
(好的题目在前面。难度可能相对较大)
ural 1003 很经典的题目,很多论文上都有对他的讲解。
主要思路跟上面差不多。 比较好的就是 把奇偶加减的转化成为 xor 亦或符号(奇数加减奇数。偶数加减偶数可以看成 1^1,0^0 而偶数 加减奇数 或者 奇数加减偶数 可以看成 0^1 1^0),节约时间。一个小小的优化。非常不错。位运算确实强大。
黑书傻姑娘 82 页 的题目。开始想错了。 一开始一直没想清楚中间的处理,因为觉得如果给的区间只有2 给的是偶数,岂不就只有是两个1.其实不是,没有考虑到还可以是0个1.
ural 1701 其实就是食物链和ural1003的变种。这道题我做的非常好,1y 这让我内流满面。后来看石牛的思想,居然一样,看来我确实进步了。也许渐渐思想会进步,也有可能是人品。 还有就是这道题 ural 给的几个数据很好。其实是降低了 trik 的难度。
ural 1701 题意:0的工资为0
n m
5 6
3 4 1200 代表 3比4多了1200的权值。
4 1 -5500
2 3 4300
3 0 8200
0 4 -7000
2 1 0
让你求不符合的第一组。
算法: 带权值的并查集
这道题需要注意:
1, 并查集的时候可能出现负的权值,所以要调换顺序 ,读入的时候使权值为正值。 然后并查的时候把小的作为根节点。但要保证 0 的权值一直是0.
2, 要注意的就是0的位置,因为没有出现0 之前所有的情况都是可以成立的。所以先处理0的情况。
其实这些都可以从题目当中的数据可以 体会出来。 所有数据很降低难度。
汪总 和石牛的思想也贴出来
http://bbs.byr.cn/article/ACM_ICPC/30648 论坛上的讨论
http://hi.baidu.com/wangkun_zhen/blog/item/cf707dfa6fc66363034f56d7.html 汪总的博客
poj 1182 我觉得应该算是基础。 不过这道题 discuss 提出的那种向量方法,觉得很受局限。不过想出此种方法的我膜拜之。此大牛也。
其实我觉得这道题应该是按三个并查集或者两个来做是正解。 因为如果题目食物链不是三个 ,而是4个,甚至一百个。这个方法才能解。而上面那种方法太特殊。
poj 1988
题意: M a b, 代表含b的链要并到含a的链条的后面。 C代表 输出a 后面有多少个元素。
不知不觉就a了,我还以为会wa ,做法和 《算法艺术》那本书的 81页 ,银河英雄传说查不多。
三个 数组, 一个记录 father 一个记录 在此链 中他前面有多少个,一个记录 在此链 中他后面有多少个。 合并的时候跟新。
并查集的一些思想
并查集实现起来很简单,但要灵活运用是需要经验积累的。。。其实说穿了,并查集中的集合就是相互间已经建立起某种联系的元素的集合,比如某个家族的所有成员就构成了一个集合;如果两个元素属于不同的集合,那么他们之间一定没有关系; 假如这两个元素产生了某种关系(这就好比两个人结婚了)那么这两个集合中的所有元素之间也必然相应的建立起了联系,接下来为了分析问题的必要,就必须把这两个集合合并起来union ,这方面网上资料很多,就不多说了。
作poj 2827