摘要: 哈哈,一次AC。题意:给你 1-n 编号的立方体,然后移动包含指定编号的立方体的堆移到另一个堆上边, 询问指定的编号立方体下面有多少个立方体。思路:由于并查集是存储的是它的父亲,那么只能从父亲那里更新数据,即只能往上推,不能往下推。 所以我干脆倒过来思考,它让我求编号为i的立方体下面有多少立方体, 那么我只要求在它上方的立方体个数,假设为m。以及整个堆中立方体的个数tot,则答案为tot-m-1,1为它自己。 开一个数组upnum,存储编号为i的立方体上方的立方体个数。 每次再查找父节点路径压缩之前先更新,从最顶层即根节点往底层更新#include #include #incl... 阅读全文
posted @ 2013-08-29 16:54 辰曦~文若 阅读(226) 评论(0) 推荐(0)
摘要: 这题的关键是如何统计转移的次数根结点都是最多移动一次的,所以记录移动次数时把自己的加上父亲结点的就是移动总数了这里要注意:更新移动次数时,一定要先更新父亲的,在更新自己的,即用递归从最顶层开始往下更新 我的方法是在调用find_root前先更新一下,再路径压缩。网上看了有人写的,在查找父节点的时候同时更新的代码:int find_root(int x){ int fa; if(father[x]==x) return x; fa=find(father[x]); int tmp=father[x]; trans[x]+=trans[tmp]; ... 阅读全文
posted @ 2013-08-29 16:07 辰曦~文若 阅读(167) 评论(0) 推荐(0)