#include<iostream>
using namespace std;
int f[100001],l[100001],i,j,n,k,x,y,z,ans=0;
int father(int x)
{
if(x==f[x]) return x;
else
{
int t1;
t1=f[x];
f[x]=father(f[x]);
l[x]=(l[x]+l[t1])%3;
return f[x];
}
}
int main()
{
cin>>n>>k;
for(i=1;i<=n;i++)
{
f[i]=i;l[i]=0;
}
for(i=1;i<=k;i++)
{
cin>>z>>x>>y;
if((z==2&&x==y)||(x>n||y>n)) //排除比较简单的假话
{
ans++;continue;
}
if(z==1) //z=1情况
{
if(father(x)==father(y))
{
if(l[x]!=l[y]) ans++;
}
else
{
l[f[x]]=(l[y]-l[x]+3)%3;
f[f[x]]=f[y];
}
}
if(z==2) //z=2情况
{
if(father(x)==father(y))
{
if(l[x]!=(l[y]+1)%3) ans++;
}
else
{
l[f[x]]=(l[y]-l[x]+4)%3;
f[f[x]]=f[y];
}
}
}
cout<<ans<<endl;
}
只有三个集合,而且不会反向,一直是A->B->C;
每一个给的条件都是判断这个虫子的集合位置;
给定的距离就3个一轮转圈也没关系%3 就行了,
距离的话就看这虫子有没有反向,只能A->B->C的顺序,
z==1 要在一个集合中,而且距离要满足相等;
z==2 要不再一个集合中,而且满足顺序。。。。。
using namespace std;
int f[100001],l[100001],i,j,n,k,x,y,z,ans=0;
int father(int x)
{
if(x==f[x]) return x;
else
{
int t1;
t1=f[x];
f[x]=father(f[x]);
l[x]=(l[x]+l[t1])%3;
return f[x];
}
}
int main()
{
cin>>n>>k;
for(i=1;i<=n;i++)
{
f[i]=i;l[i]=0;
}
for(i=1;i<=k;i++)
{
cin>>z>>x>>y;
if((z==2&&x==y)||(x>n||y>n)) //排除比较简单的假话
{
ans++;continue;
}
if(z==1) //z=1情况
{
if(father(x)==father(y))
{
if(l[x]!=l[y]) ans++;
}
else
{
l[f[x]]=(l[y]-l[x]+3)%3;
f[f[x]]=f[y];
}
}
if(z==2) //z=2情况
{
if(father(x)==father(y))
{
if(l[x]!=(l[y]+1)%3) ans++;
}
else
{
l[f[x]]=(l[y]-l[x]+4)%3;
f[f[x]]=f[y];
}
}
}
cout<<ans<<endl;
}
只有三个集合,而且不会反向,一直是A->B->C;
每一个给的条件都是判断这个虫子的集合位置;
给定的距离就3个一轮转圈也没关系%3 就行了,
距离的话就看这虫子有没有反向,只能A->B->C的顺序,
z==1 要在一个集合中,而且距离要满足相等;
z==2 要不再一个集合中,而且满足顺序。。。。。