题意:给出动物总数和询问次数,每次输入两个数‘1’或‘2’。接下来输入两种动物,判断其食物链有没有矛盾(即是否有自己吃自己的或者小吃大的)。
思路:经典加权并查集问题,对食物链上每个动物赋值代表哪一级,本题是3级食物链所以对取得的值模3就行。
代码:
#include<iostream>
#define ll long long
#include<cstring>
using namespace std;
const ll N=1e7;
ll pre[N];
ll shiwu[N];
ll find(ll x)
{
if(x!=pre[x])
{
int s=pre[x];
pre[x]=find(pre[x]);
shiwu[x]=(shiwu[x]+shiwu[s])%3;
}
return pre[x];
}
int main()
{
ll n,k;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
ll d,x,y;
ll res=0;
while(k--)
{
scanf("%lld%lld%lld",&d,&x,&y);
ll a=find(x);
ll b=find(y);
if(x>n||y>n||(x==y&&d==2))res++;
else if(a==b)//同一营养级
{
if((shiwu[x]+d-1)%3!=shiwu[y])res++;
}else if(a!=b)//不同营养级
{
pre[b]=a;
shiwu[b]=(shiwu[x]+d+2-shiwu[y])%3;
}
}
printf("%lld\n",res);
return 0;
}