题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f62188b89679bfcbbc3481d7c22dedaf.png)
思路讲解
![这题多维护了一种额外信息](https://i-blog.csdnimg.cn/blog_migrate/b6bced31b456c3d70141cb83a94c9700.png)
代码展示
#include <iostream>
using namespace std;
const int N = 50010;
int n, m;
int p[N], d[N];
int find(int x) {
if (p[x] != x) {
int t = find(p[x]);
d[x] += d[p[x]];
p[x] = t;
}
return p[x];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) p[i] = i;
int res = 0;
while (m--) {
int t, x, y;
scanf("%d%d%d", &t, &x, &y);
if (x > n || y > n) res++;
else {
int px = find(x), py = find(y);
if (t == 1) {
if (px == py && (d[x] - d[y]) % 3) res++;
else if (px != py) {
p[px] = py;
d[px] = d[y] - d[x];
}
} else {
if (px == py && (d[x] - d[y] - 1) % 3) res++;
else if (px != py) {
p[px] = py;
d[px] = d[y] + 1 - d[x];
}
}
}
}
printf("%d\n", res);
return 0;
}