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] 了.
三种动物 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] 了.
相关文章推荐
- codevs 1074 食物链(并查集)
- CODE[VS]1074 食物链 扩展域并查集
- wikioi 1074 食物链 并查集
- poj 1182/codevs 1074 食物链
- wikioi-天梯-提高一等-并查集-1074:食物链
- codevs 1704 [NOI2001] 食物链 并查集
- Codevs-1074 食物链
- codevs 必做:堆:1245、2879 并查集:1069、1074、1073
- 1074 食物链 (并查集)
- 【codevs 1074】食物链
- 【codevs】1074 食物链
- codevs 1074 食物链
- codevs 1074食物链 并查集
- codevs 1074 食物链(并查集)
- 【并查集】【向量偏移】[NOI 2001]食物链 eat WikiOI 1074
- 【并查集】食物链(关系并查集)
- pku 1182 食物链(并查集扩展)
- poj 1182食物链(带权并查集)
- POJ 1182 食物链,并查集的拓展
- codevs1074 食物链(并查集+向量偏移)