思路参考了大佬题解图文并茂非常详细
#include<cstdio>
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
const int N=5e4+10;
int set[N*3];
int n,k;
int a,b,c;
int cnt=0;
int findset(int x)
{
return set[x]==x?x:set[x]=findset(set[x]);
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&k);
_rep(i,1,n*3)set[i]=i;
_rep(i,1,k)
{
scanf("%d%d%d",&a,&b,&c);
if(b>n||c>n)cnt++;
else if(a==1)
{
if(findset(b+n)==findset(c)||findset(b)==findset(c+n))cnt++;
//b被c吃||c被b吃
else set[findset(b)]=findset(c),set[findset(b+n)]=findset(c+n),set[findset(b+n+n)]=findset(c+n+n);
}
else
{
if(findset(b)==findset(c)||findset(b+n)==findset(c))cnt++;
//b和c是同类||b被c吃
else set[findset(b)]=findset(c+n),set[findset(b+n)]=findset(c+2*n),set[findset(b+2*n)]=findset(c);
}
}
printf("%d\n",cnt);
return 0;
}