定义
R = 0 与其父亲为同类 R = 1 被父亲吃 R = 2 吃父亲
(x,y) | (y,z) | (x,z) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
0 | 2 | 2 |
1 | 0 | 1 |
1 | 1 | 2 |
1 | 2 | 0 |
2 | 0 | 2 |
2 | 1 | 0 |
2 | 2 | 1 |
注意这样的转移即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAX_N 50010
#define sci(num) scanf("%d",&num)
using namespace std;
#define MOD 3
int fa[MAX_N], r[MAX_N];
int N, K, D, X, Y;
int Find(int x) {
if (fa[x] != x) {
int p = fa[x];
fa[x] = Find(fa[x]);
r[x] = (r[x] + r[p]) % MOD;
}
return fa[x];
}
void init() {
for (int i = 0;i <= N;i++) {
fa[i] = i;
r[i] = 0;
}
}
int main() {
sci(N); sci(K);
init();
int cntf = 0;
for (int i = 0;i < K;i++) {
sci(D); sci(X); sci(Y);
if (X > N || Y > N ) {
cntf++;
continue;
}
int fx = Find(X); int fy = Find(Y);
if (D == 1) {
if (fx == fy) {
if (r[X] != r[Y]) cntf++;
} else {
r[fy] = (r[X] - r[Y] + MOD) % MOD;
fa[fy] = fx;
}
} else if (D == 2) {
if (fx == fy) {
int rxy = (r[X] - r[Y] + MOD) % MOD;
if (rxy != 2) cntf++;
} else {
int rxfy = (2 + r[Y]) % MOD;
int rfxfy = (r[X] - rxfy + MOD) % MOD;
r[fy] = rfxfy;
fa[fy] = fx;
}
}
}
printf("%d\n",cntf);
return 0;
}