题目链接:
https://www.acwing.com/problem/content/242/
一句话总结:用每一个点到根结点的距离来表示吃的关系
余1表示可以根结点,余2表示可以被根结点吃,余0表示和根结点同类
根结点可以看成到自己的距离余0
Acwing编译器的oj感觉有bug

 //用带权并查集的做法
#include <iostream>
using namespace std;
const int N = 50010;
int n,k;
int f[N];  
int d[N];




int find(int x)
{
    if (f[x] != x)
    {
        int t = find(f[x]);
        d[x] += d[f[x]];
        f[x] = t;
    }
    return f[x];
}


int main(){
    cin>> n>>k;
    int res =0 ;
    for(int i =1;i<=N;i++) f[i] = i;

    for(int i = 0;i<k;i++)
    {
        int t, x, y;
        scanf("%d%d%d", &t, &x, &y);

        if (x > n || y > n) res ++ ;
        else
        {
            int fx = find(x), fy = find(y);
            if (t == 1)
            {
                if (fx == fy && (d[x] - d[y]) % 3) res ++ ;
                else if (fx != fy)
                {
                    f[fx] = fy;
                    d[fx] = d[y] - d[x];
                }
            }
            else
            {
                if (fx == fy && (d[x] - d[y] - 1) % 3) res ++ ;
                else if (fx != fy)
                {
                    f[fx] = fy;
                    d[fx] = d[y] + 1 - d[x];
                }
            }
        }
    }

    cout<<res<<endl;

    return 0;
}