题目链接:
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; }