主要是有三种动物,所以我们以这三种动物为集合,每次操作的时候,我们要把所以情况合并起来,然后也就是需要开三倍数组.我的理解就是当前并查集仅仅就是把存在的关系列出来了,然后进行查找,而不是说把他们分别是什么记录下来(在合并前用n和2*n就分开了)

#include<iostream>
#include<algorithm>
using namespace std;
const int N=200010;
int fa[N];
int n,k,cnt;
int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
	fa[find(x)]=find(y);
}
int main()
{
	cin>>n>>k;
    for(int i=1;i<=3*n;i++)fa[i]=i;
    while(k--)
    {
    	int op,x,y;
    	cin>>op>>x>>y;
        if(x>n||y>n){
            cnt++;
            continue;
        }//题干有要求,所以判断后直接退出当前循环
        if(op==1)//x和y是同类,所以如果找到的不是同一根,那么就为假,否则为真,并且把真给合并进去
        {
        	if(find(x)==find(y+n)||find(x)==find(y+2*n))cnt++;
            else
            {
            	merge(x,y);
                merge(x+n,y+n);
                merge(x+2*n,y+2*n);
            }
        }
        else
        {
        	if(find(x)==find(y)||find(x)==find(y+2*n))cnt++;
            else
            {
            	merge(x,y+n);
                merge(x+n,y+2*n);
                merge(x+2*n,y);
            }
        }
    }
    cout<<cnt;
    return 0;
}