AcWing 240. 食物链
原题链接
中等
作者:
鹰
,
2021-04-03 12:24:53
,
所有人可见
,
阅读 294
#include<iostream>
#include<stdio.h>
using namespace std;
const int N = 50010;
int p[N], d[N]; //d[i]是i到根节点的距离,距离为0就是根节点本身,为1是吃根的,2是吃1且被根吃的
int n, m, res;
int find(int x)
{
if(p[x] != x)
{
int t = p[x];
p[x] = find(p[x]);
d[x] += d[t];
}
return p[x];
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
{
p[i] = i; d[i] = 0;
}
while(m --)
{
int k, a, b;
scanf("%d%d%d", &k, &a, &b);
if(a > n || b > n)
{
res ++;
continue;
}
int px = find(a);
int py = find(b);
if(k == 1)
{
if(px == py && (d[a] - d[b]) % 3) res ++; //如果ab在同一集合而且不是同类关系的话
else if(px != py) //等价于(d[a] - d[b]) % 3 != 0
{
p[px] = py;
d[px] = d[b] - d[a];
}
}
else
{
if(px == py && (d[a] - d[b] - 1) % 3) res ++; //等价于(d[a] - d[b] - 1) % 3 != 0
else if(px != py)
{
p[px] = py;
d[px] = d[b] + 1 - d[a];
}
}
}
cout << res;
return 0;
}