首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

HDU 1856 More is better 并查集 途径压缩

2012-08-14 
HDU 1856 More is better 并查集 路径压缩做了并查集一段时间了。个人觉得利用并查集解题的套路其实很单调。

HDU 1856 More is better 并查集 路径压缩

做了并查集一段时间了。个人觉得利用并查集解题的套路其实很单调。

1、开一个数组记录各个节点的父节点,初始化

2、给出一对关联的数据,查找

3、根据查找结果如果根不属于同一集合则合并

当然,还可以优化。主要是在查找利用递归,使得在回溯时各个节点的父节点都是树的根节点。下次查找就可以

降低查找长度。其次,可以利用一个数组记录每棵树的高度。在合并时将矮树链接到高树上,使得新生成的树尽

量矮。

大家可以看看这两个链接:点击打开链接 和点击打开链接

 

我做这题的想法:

1、在合并两棵树时一般要求是根节点不相同才合并。其实,我觉得这个要求也是可以根据实际情况来看的。

如果只是比较单纯的并查集问题可以相同也合并,合并前后也没有啥变化。但是比如本题就必须是不同才合并。

相同也合并会对num[]造成影响。

2、注释掉的代码是用来在合并时将矮树链接到高树上用的。可是空间不够了。

大家在看代码时可能会发现这样一个问题,以a为根的树链接到以b为根的树上后,height[a]应该赋值为0。代码中

并没有这样做。因为不处理也不影响。为啥呢?因为a已经不再是根了。即使下次要处理一组关联的边(a,c)时,也

是用a的根和c链接。也就是说a不会再成为根,height[a]也不会再被用了。

 

AC代码:


 

 

 

 

热点排行