题目 : Family Property
分值 : 25
难度 : 并叉集
思路 : 并叉集来做,一开始就想到了,但是他是变式,就很惹人厌.
坑点 : 总的来说首先是一个结构体来并叉集,这个简单,但是他除了并叉集之外,还有几个恶心人的
地方,他有其他的要求:
1)首先你作为一个联通集的根 要是整个联通集最小的
2)其次你要把一个联通集的所有节点两个变量都加合起来求平均 作为整个联通集的特性
3)然后你要根据一个集合的两个平均变量做出排序
一开始我的做法:
单方面去记录联通集信息,然后用单独记录每个集合的 最小成员id 和 两个平均变量,烦😡
也导致了一开始做的很不顺利,完全是探索式地去写,哪有问题就贴一个膏药,效率低下
然后冷静思考了原因,发现自己对于这种问题的求解一直存在着问题:
首先利用 结构体存放每个节点信息 利用结构体完成 并叉集中的 集合划分
求解每个区域的最小节点id: 遍历每个节点,如果发现节点的根 比自己大,调换一下
(一开始我怀疑这种操作会不会打乱之前压缩好的路径,其实不然,因为每次调换都会重新压缩)
求解每个区域的成员个数: 遍历每个节点,除非是根节点,不然每个节点的根节点.count++
求解每个区域的总财产值: 遍历每个节点,除根节点外,每个节点的根节点财产值都加上当前节点财产.
然后遍历每个有效的根节点,存入结果数组,根节点个数就出来了,然后按要求结构体排序输出.
具体代码如下
1 |
|