食物链(并查集)
题目在这里
AC代码:
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=100010;
int d[N],p[N];
int find(int x)
{
if(x!=p[x])
{
int t=find(p[x]);
d[x]+=d[p[x]];
p[x]=t;
}
return p[x];
}
int main()
{
int res=0;
int m,n;
cin>>n>>m;
for(int i=1;i<=n;i++)
p[i]=i;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
int px=find(b),py=find(c);
if(b>n||c>n)
res++;
else if(a==1)
{
if(px==py&&(d[c]-d[b])%3)
{
res++;
}
else if(px!=py)
{
p[px]=py;
d[px]=d[c]-d[b];
}
}
else{
if(b==c) res++;
else if(px==py&&(d[c]-d[b]-1)%3)
{
res++;
}
else if(px!=py)
{
p[px]=py;
d[px]=d[c]-d[b]-1;
}
}
}
printf("%d\n",res);
return 0;
}