功能
将两个集合合并
询问两个元素是否在一个集合当中
code
初始化
for( int i = 1; i <= n; i ++ )
fa[i] = i;
查询( 返回x的祖宗节点 + 路径压缩 )
int find( int x )
{
if( fa[x] == x )
return x;
else
{
fa[x] = find( fa[x] );
return find( fa[x] );
}
}
合并
void merge( int x, int y )
{
fa[find( x )] = find( y );
// 合并 x 和 y 所在的集合
fa[x] = fa[y];
// 把x合并到y下面
}
反集
若 a 和 b 是敌人 合并 n + a 和 b n + b 和 a
若 a 和 c 是敌人 合并 n + a 和 c n + c 和 a
则 b 和 c 就处在一个集合


京公网安备 11010502036488号