答案:
#include <cstdio>
#include <iostream>
int f[150005];///用于存祖先。
int getf(int x)
{
if(x==f[x])
return x;
f[x] = getf(f[x]);
return f[x];
}
void join(int x,int y)
{
int xx = getf(x);
int yy = getf(y);
if(xx!=yy)
f[xx]=yy;
}
int main()
{
int n,k;
int d,x,y;
int i;
scanf("%d%d",&n,&k);
for(i=1; i<=n*3; i++)///初始化一定要在外面。
f[i] = i;///初始化
int ans = 0;///用来记录错误的信息数量。
while(k--)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n)///不符合第二条条件。
{
ans++;
continue;///重新输入。进入下一个循环。
}
if(d==1)///如果是同类。
{
if(getf(x)==getf(y+n)||getf(x)==getf(y+2*n))///如果吃别人,或者被别人吃。不符合d==1这个条件。
{
ans++;
}
else///如果符合条件就合并。
{
join(x,y);///为什么分三块?
join(x+n,y+n);///因为咱们只知道关系,不知道是A是B还是C
join(x+2*n,y+2*n);///所以说,咱们开一个3*n的空间每n存储一种类型。
}
}
else if(d==2)///如果是吃的关系。
{
if(getf(x)==getf(y)||getf(x)==getf(y+2*n))///如果是同类,或者被吃的关系,与d==2条件不符。
{
ans++;
}
else
{
join(x,y+n);///这三个是把吃与被吃的关系建立联系。
join(x+n,y+2*n);///还是因为不知道是A是B还是C
join(x+2*n,y);///所以说,三种情况全部建立联系。不会影响后面的判断。
}
}
}
printf("%d\n",ans);
return 0;
}