建图种类并查集即可
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int fa[N],d[N];
int ask(int x)
{
if(fa[x]!=x)
{
int root=ask(fa[x]);
d[x]+=d[fa[x]];
fa[x]=root;
}
return fa[x];
}
int main()
{
for(int i=1;i<=N-5;i++) fa[i]=i;
int n,T;
cin>>n>>T;
int res=0;
while(T--)
{
int a,b,c;
cin>>a>>b>>c;
if(c>n||b>n||(a==2&&b==c)) {res++; continue;}
int pa=ask(b);
int pb=ask(c);
if(a==1)//b c同类
{
if(pa==pb)//假如关系确认
{
if((d[b]-d[c])%3!=0) res++;
}
else//建立关系
{
fa[pa]=pb;
d[pa]=d[c]-d[b];
}
}
else//b 吃 c
{
if(pa==pb)//假如关系确认
{
if((d[b]-d[c]-1)%3!=0) res++;
}
else//建立关系
{
fa[pa]=pb;
d[pa]=d[c]-d[b]+1;
}
}
}
cout<<res<<endl;
return 0;
}
/*
我们按权值并查集定义三类.
x%3==0表示与根同类
x%3==1表示可以吃根节点
x%3==2表示可以被根节点吃
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
*/

京公网安备 11010502036488号