您的位置:首页 > 其它

CODEVS-1074-食物链-并查集

2015-04-05 13:36 183 查看
描述

三种动物 A吃B, B吃C, C吃A.

1, a, b 表示a,b同类

2, a, b 表示a吃b

判断假话个数

分析

NOIp前看过, 当时不会, 现在理解起来也有点抽象.

按权值合并的并查集

能确定关系的 x, y 的find到的祖先相同.

pa[x] 是 x 的祖先, r[x] 是 x 到祖先的距离, 有三种, 0, 1, 2. 0 表示和祖先同类, 1表示可以吃祖先, 2表示被吃. r[find(x)] 一定为 0 我用 assert 验证了一下.

查找时先记录下 x 当前的祖先 px, 可知当 x 和 px 最初确定关系的时候 r[px] 一定为0. 而递归 find(px) 之后 r[px] 的数值就是 px 到现在的祖先的距离, x 和 px 现在的祖先是相同的, 那么 x 到现在祖先的距离就是 x 到原来 px 的距离加上 px 到现在祖先的距离.

合并 x, y 时, 先px = find(x), py = find(y). 比如要把 pa[px] 设成 py, 那 py 是不会变了, 考虑 px 的秩怎么变. 如果合并后要求 x, y 同类, 那么 x 到 py 的距离应当等于此时的 r[y], 那么 r[x] + r[px] == r[y], 所以 r[px] = r[y] - r[x]. 这样在路径压缩后新的 r[x] 就等于
r[y] 了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: