cpp
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N=50010;
int n,m;
int p[N],d[N];
int find(int x){
if(x!=p[x]){
int t=find(p[x]);
d[x]+=d[p[x]];
p[x]=t;
}
return p[x];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
p[i]=i;
}
int ans=0;
while(m--){
int t,x,y;
cin>>t>>x>>y;
if(x>n||y>n){
ans++;
}else{
int px=find(x),py=find(y);
if(t==1){
if(px==py&&(d[x]-d[y])%3){
ans++;
}else if(px!=py){
p[px]=py;
d[px]=d[y]-d[x];
}
}else{
if(px==py&&(d[x]-d[y]-1)%3){
ans++;
}else if(px!=py){
p[px]=py;
d[px]=d[y]-d[x]+1;
}
}
}
}
printf("%d\n",ans);
return 0;
}
总共三种动物,维护和根节点之间的距离。对三取模之后把同一个集合里面的动物分为了三类。