<pre name="code" class="cpp">#include <stdio.h> int ani[55000], rel[55000]; void init(int n) { int i; for(i=0; i<=n; i++) { ani[i] = i; rel[i] = 0;} } int findd(int x)<span style="white-space:pre"> </span>//回溯路径压缩,好好理解0.0 { int fx; if(x == ani[x]) return x; fx = ani[x]; ani[x] = findd(fx); rel[x] = (rel[x]+rel[fx])%3;<span style="white-space:pre"> </span>//向量法,高大上 x->y = x->fx + fx->fy + fy->y return ani[x]; } int judge(int d, int x, int y, int n) { int fx, fy; if( (x>n || y>n) || (x==y && d==1) ) return 0; fx = findd(x); fy = findd(y); if( (fx==fy) && ((rel[x]-rel[y]+3)%3 != d) ) return 0; ani[fx] = fy; rel[fx] = (-rel[x] + d + rel[y] +3)%3; return 1; } int main() { int n, k, d, x, y, i; int sum = 0; scanf("%d%d", &n, &k); init(n); for(i=0; i<k; i++) { scanf("%d%d%d", &d, &x, &y); if(!judge(d-1, x, y, n)) sum++; } printf("%d\n", sum); return 0; }