码迷,mamicode.com
首页 > 其他好文 > 详细

CODEVS-1074-食物链-并查集

时间:2015-04-05 14:42:14      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:并查集

描述

三种动物 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-食物链-并查集

标签:并查集

原文地址:http://blog.csdn.net/qq_21110267/article/details/44887337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!