这题需要注意就是 并查集中 相对位置 注意与绝对距离区别
#include<cstdio>
#define maxn 50005
int ans,i,a,b,p,fa,fb,n,k;
int f[maxn],rank[maxn];
int findfather(int x){
if(f[x]==x)
return(x);
else{
int k=f[x];//保存之前的fa以便之后进行叠加距离
f[x]=findfather(f[x]);
rank[x]=(rank[k]+rank[x])%3;
return(f[x]);
}
}
int main()
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
f[i]=i;
rank[i]=0;
}
for(i=1;i<=k;i++){
scanf("%d%d%d",&p,&a,&b);
if(a>n||b>n||(a==b&&p==2)){
ans++;
continue;
}
fa=findfather(a);
fb=findfather(b);
if(p==1){
if(fa==fb&&rank[a]!=rank[b])
ans++;
if(fa!=fb){
f[fa]=fb;
rank[fa]=(rank[b]-rank[a]+3)%3;
//rank[a]=rank[b]; 此处rank[a]表示的是a与fa的距离,因此不能改变,而不能进行更新,下次会更新到。
}
}else{
if(fa==fb&&(rank[a]+1)%3!=rank[b]%3)
ans++;
if(fa!=fb){
f[fa]=fb;
rank[fa]=(rank[b]-rank[a]+5)%3;
//rank[a]=(rank[b]+2)%3;
}
}
}
printf("%d
",ans);
return 0;
}