解法 1 反集
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+100;
const int M=1e5+100;
int f[N*3],n,k,cnt,food[N];
int find(int x){
if(f[x]!=x)return f[x]=find(f[x]);
return x;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n*3;i++)//利用反集 开三倍的n
f[i]=i;
for(int i=1;i<=k;i++){
int d,x,y;
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n){
cnt++;
continue;
}
else if(d==1){
if(f[find(x+n)==find(y)]||f[find(y+n)]==find(x))cnt++;//若x和y为敌人则x+n和y同根,y+n和x同根
else {
f[find(x)]=find(y);//x和y同根 则 x+n和y+n同根 x+2*n和y+2*n同根
f[find(x+n)]=find(y+n);
f[find(2*n+x)]=find(2*n+y);
}
}
else if(d==2){
if(find(x)==find(y) || find(x)==find(y+n))cnt++;//find(x)==find(y+n)代表y吃x
else{
f[find(x+n)]=find(y);
f[find(x+2*n)]=find(y+n);
f[find(x)]=find(y+2*n);
}
}
}
cout<<cnt<<endl;
return 0;
}