题目大意:
解题思路:点击打开链接
我们用0表示祖先和该节点的关系为同类,用1表示祖先吃该节点,用2表示祖先被该节点吃掉,向量的指向是从祖先指到节点的
#include<cstdio>
#include<cstring>
#define maxn 50010
int r[maxn],p[maxn];
int N,K,D,X,Y;
int find(int x) {
if(x == p[x])
return x;
int tx;
tx = find(p[x]);
r[x] = (r[x] + r[p[x]]) % 3;
return p[x] = tx;
}
int main() {
scanf("%d%d",&N,&K);
int num = 0;
for(int i = 1 ; i <= N + 1; i++) {
p[i] = i;
r[i] = 0;;
}
for(int i = 1; i <= K; i++) {
scanf("%d%d%d",&D,&X,&Y);
if(X > N || Y > N) {
num++;
continue;
}
if(D == 2 && X == Y) {
num++;
continue;
}
int tx = find(X);
int ty = find(Y);
if(tx == ty) {
if( D == 1 && r[X] != r[Y]) {
num++;
continue;
}
if(D == 2 && ((3 - r[X] + r[Y]) % 3 != 1) ) {
num++;
continue;
}
}
else {
p[ty] = tx;
r[ty] = ( r[X] - r[Y] + D + 2) % 3;
}
}
printf("%d\n",num);
return 0;
}