种族并查集

种族并查集

P2024 [NOI2001] 食物链

题意

有三种动物 \(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\)

代码

posted @ 2025-03-01 17:34  xcr0987  阅读(14)  评论(0)    收藏  举报