有 A,B,C 三种物种 , 但因为给定的 N 个动物之间的关系是相对的,我们没办法只用三个集来表示 N 个动物所属的物种。网上都说这题是用并查集做的,其实这题并没有集合的概念,大部分人只是借鉴了并查集的数据结构及操作。
我的思路是这样的,用树来存储各动物间的相互关系。结点有两个域, parent 和 flag ( parent 的作用大家都知道,这里 flag 用来表示子节点和父节点的关系, flag 为真表示父节点吃子节点, flag 为假表示父节点和子节点是同类。舍弃 rank 是因为编码麻烦,不想写。)给定一个动物编号,通过 flag 往上递推,我们可以得到该动物和其所在树的根节点动物之间的关系。于是给定不在同一棵树的 两个 动物的编号和关系,我们可以得到这两棵树的根结点动物见的关系,这样就可以在合并的时候选择恰当的方式。每读入一句话,如果两个动物处在不同的树,那么这句话肯定是真的,并且又得到了一个相对关系,我们可以合并他们所在的树。如果两个动物处在相同的树,我们则可以根据他们跟树根动物的关系来得到他们之间的关系,以此判断话的真假。
这种方法在内存使用上有点优势,但速度稍微有点慢,要 200 多 ms 。如果你会更快的算法,请告诉我。
还有通过做这题,我才明白 (-5)%3=-2(我原来以为会是1),因为这个,我白送了3次WA。