和之前那个模板道理是一样的:https://blog.csdn.net/qq_38367681/article/details/81257566;
直接上代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=50000+100;
int pa[MAXN];
int v[MAXN];
int findset(int x)
{
if(pa[x]==-1)return x;
int temp=findset(pa[x]);
v[x] =(v[x]+v[pa[x]] )%3;
return pa[x]=temp;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
memset(pa,-1,sizeof(pa));
memset(v,0,sizeof(v));
int ans=0;
while(k--)
{
int d,x,y;
scanf("%d%d%d",&d,&x,&y);
int fx=findset(x);
int fy=findset(y);
if(x>n||y>n)
{
ans++;
continue;
}
if(fx==fy)//同类则在一棵树上,不用合并
{
if(d==1 && v[x]!=v[y]) ans++;
if(d==2 && ( (v[x]+1)%3 ) !=v[y] ) ans ++;
}
else
{
if(d==1)
{
pa[fy]=fx;
v[fy]=(v[x]-v[y]+3)%3;
}
else if(d==2)
{
pa[fy]=fx;
v[fy]=(v[x]-v[y]+1+3)%3;
}
}
}
printf("%d\n",ans);
return 0;
}