功能 将两个集合合并 询问两个元素是否在一个集合当中 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 就处在一个集合