和之前判断虫子是否有同性恋一样==(不是因为脑洞太大)都是分层的 取模的啊啊啊啊啊仔细观察一下两个代码,相似度好高好高哦哦
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int total;
int n,m,a,b,c;
int f[500005],rank[500005];
void init(int n)
{
for(int i=0;i<=n;i++)
{
f[i]=i;
rank[i]=0;
}
}
int find(int x)
{
if(x==f[x]) return x;
int tmp=f[x];
f[x]=find(f[x]);
rank[x]=(rank[tmp]+rank[x])%3;
return f[x];
}
bool uni(int x,int y,int a)
{
int fx=find(x),fy=find(y);
if(fx==fy)
{
if(a==1&&rank[x]!=rank[y]) return false;
if(a==2)
{
if(rank[x]==2&&rank[y]!=1) return false;
if(rank[x]==1&&rank[y]!=0) return false;
if(rank[x]==0&&rank[y]!=2) return false;
}
return true;
}
f[fx]=fy;
if(a==1) rank[fx]=(rank[y]-rank[x]+3)%3;///fx fy x y!1
if(a==2) rank[fx]=(rank[y]-rank[x]+4)%3;///
return true;
}
int main()
{
// freopen("cin.txt","r",stdin);
scanf("%d%d",&n,&m);
///n:人数 m:操作数
total=0;
init(n);
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(b>n||c>n||a==2&&b==c)
{
total++;
continue;
}
if(!uni(b,c,a)) total++;
}
printf("%d\n",total);
return 0;
}