种族并查集
种族并查集
题意
有三种动物 \(A,B,C\),\(A\) 吃 \(B\),\(B\) 吃 \(C\),\(C\) 吃 \(A\)。
\(n\) 个动物,每个动物都属于这三种之一,现给出 \(K\) 个条件,每个条件描述两个动物的关系。如果该条件与前述条件矛盾,忽略该条件并计数,输出最终计数。
做法
种族并查集,我们用 \(3\times n\) 大小个并查集维护三种动物的关系。
该 \(3\times n\) 的并查集有三组,每组都有动物 \(1\sim n\) 的信息。这三组假设为 \(X,Y,Z\)。
添加关系
- 如果有同类关系出现,那么分别将 \(X,Y,Z\) 三组每一组中的两只动物之间合并。
- 如果是 \(a\) 吃 \(b\) 关系,那么我们分别将 \(X,Y,Z\) 中的 \(a\) 与对应下一组的 \(b\) 合并。(下一组的含义:\(X\) 的下一组是 \(Y\),\(Y\) 的下一组是 \(Z\),\(Z\) 的下一组是 \(X\))
根据联通性关系以及“下一组”所自带的次序之分,这样添加关系很好地保存和维护了信息。
检查关系
其实读到这里应该已经明白了。检查两个动物的关系,我们可以反过来。如果同一组内的 \(a\) 和 \(b\) 在同一并查集内,代表 \(a,b\) 同类。如果某一组中的 \(a\) 与下一组的 \(b\) 在同一并查集内,代表 \(a\) 吃 \(b\)。

浙公网安备 33010602011771号