题解网上有很多。。。不想说了。。。考场上像我这种蒟蒻是想不出来的吧。。。提醒大家一点,按照向量运算去理解带权并查集的路径压缩会非常有帮助哟
#include<cstdio>
int const N=50010;
int n,fa[N],d[N],count=0;
int find(int x){
if(x==fa[x]) return x;
int xx=find(fa[x]);
d[x]+=d[fa[x]];
return fa[x]=xx;
}
//d[x]=0--表示x与他的父亲为同类
//d[x]=1--表示x被他的父亲吃
//d[x]=2--表示x吃他的父亲
//所有边都指向父节点
int main(){
// freopen("a.in","r",stdin);
int TT;
scanf("%d%d",&n,&TT);
for(int i=0;i<=n;i++) fa[i]=i;
while(TT--){
int s,x,y;
scanf("%d%d%d",&s,&x,&y);
if(x>n||y>n){
count++;continue;
}
if(x==y){
if(s==1) continue;
else count++;continue;
}
s--;//表示y->x
int xx=find(x),yy=find(y);
if(xx!=yy) fa[yy]=xx,d[yy]=d[x]+s-d[y];//x->xx,y->x,yy->y
else{
int ss=d[y]-d[x];//表示y->x
while(ss<0) ss+=3;
if(ss%3!=s) count++;
}
}
printf("%d",count);
return 0;
}