- 题目链接 : http://poj.org/problem?id=1182
- 题意 :有A,B,C三种动物构成环形的食物链,现给你M句话,每句话形式"D X Y",1表示X和Y同类,2表示X吃Y。判断假话有多少句。其中 :1)与前面的话冲突 2)X和Y大于动物编号N 3)D =2 &&X =Y 是假话。
- 思路 :这是一道经典的并查集题目。涉及到并查集,我们就针对这道题目设置并查集中各个元素的含义。
我们将可以确定关系的放在一个集合(即同类或者X 吃/被吃 Y)。rk[i]表示i与根节点的关系 :
rk[i] = 0 表示i和根节点是同类
rk[i] = 1 表示根节点吃i
rk[i] = 2 表示i吃根节点
一、初始化: node[i] = i , rk[i] = 0。 即每个节点都属于独立的集合,
二、find() 函数 : 除去 node[x] = find(node[x])外,每次递归还需要更新rk[x]的值。在没有更新之前 rk[x]代表x和node[x]的关系,每次更新将rk[x]设置为x和根节点的关系。即t = node[x] rk[x] = (rk[x] + rk[t]) % 3。
这里有两个点需要解释一下
1)t = node[x]的目的。find函数中有 node[x] = find(node[x]),如果不设置t = node[x]ÿ