种类并查集
在一般的并查集当中,普通并查集只能维护一般的等价类关系,如果存在多个等价类关系,就需要用到种类并查集了。
原理
集合中的元素直间存在两种关系,假设 A A A与 B B B的关系是关系1, B B B与 C C C的关系是关系 2 2 2,那么 A A A和 C C C一定存在关系,这种情况才能用种类并查集(即关系传递)。
例如:朋友与敌人关系,朋友的朋友是朋友,朋友的敌人是敌人,敌人的朋友是敌人,敌人的敌人是朋友。这种相互传递的关系才能用种类并查集,如果是单链的关系,是不能用种类并查集维护的。
我们创建三倍空间的大小的并查集,其中另外两个元素空间是原集合的拷贝。例如 A A A和 A ′ A' A′和 A ′ ′ A'' A′′。
和 A ′ A' A′相等价的是A的朋友,和 A ′ ′ A'' A′′相等价的是A的敌人。比如A和B是朋友,那么就让 A ′ A' A′和 B B B相连, B ′ B' B′和 A A A相连。同时B的敌人仍是A的敌人,A的敌人也是B的敌人,所以 A ′ ′ A'' A′′和 B ′ ′ B'' B′′相连。构成的这样一种关系。同时我们还发现,第一个并查集空间并不表示任何空间,我们将这个并查集和 A ′ A' A′合并,省去一个并查集空间。
切记,验证这个题是否符合种类并查集,要验证每一步合并都是合法合理的,例如,上述中, A ′ ′ A'' A′′和 B ′ ′ B'' B′′这两个合并,满足A的敌人和B的敌人相同,如果题目要求A的敌人是B的敌人,但是B的敌人不是A的敌人,那么这样连接并查集中的元素就是不合法的。