思路:我们假设现在有3个动物a,b,c现在我们需要知道他们的关系,已知a吃b,b吃c,那么c吃a。现在我们用0 1 2 来表示他们之间的关系。0表示同类,1表示吃,2表示被吃。则有以下关系:
a->b = = 1; ;b->c = = 1; ;a->c = = 2
这题的关键就是给你a和b的关系,b和c的关系,如何求a和c的关系。
假设a->b关系为x,b->c关系为y即a(x)b(y)c
这个表的数据表示的是a和c的关系
分析这个表我们可以得到一个公式,a和c的关系 == (x+y)%3。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#define N 50010
using namespace std;
int fa[N];
int ral[N];
int ans;
int fin(int x)
{
if(x == fa[x])
return x;
int t = fa[x];
fa[x] = fin(fa[x]);
ral[x] = (ral[x]+ral[t])%3;
return fa[x];
}
void on(int x,int y,int ra)
{
int p = fin(x);
int q = fin(y);
if(p == q && (ral[y]+ra)%3 != ral[x])//这里的关系自己画图推一下就好了
{
ans++;
}
else if(p != q)
{
fa[p] = q;
ral[p] = (ra+3+ral[y]-ral[x])%3;//这里一定要加三不然括号里面会出现负值
}
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
ans = 0;
for(int i = 0; i <= n; i++)
{
fa[i] = i;
ral[i] = 0;
}
int a,b,ra;
while(k--)
{
scanf("%d %d %d",&ra,&a,&b);
if(a > n || b > n)
{
ans++;
continue;
}
int rala = ra-1;
on(a,b,rala);
}
printf("%d\n",ans);
return 0;
}