http://poj.org/problem?id=1182
题意应该就不用说了,关系之间的解释看大神的吧http://www.cnblogs.com/wuyiqi/archive/2011/08/24/come__in.html
#include<stdio.h> const int maxn = 100005; int f[maxn], r[maxn];//r[i]代表i与根节点之间的关系,0代表同类,1代表x吃y;2代表x被y吃; int Find(int x) { int k = f[x]; if(f[x] != x) { f[x] = Find(f[x]); r[x] = (r[k]+r[x])%3; } return f[x]; } int main() { int i, N, T, ans=0; scanf("%d%d", &N, &T); for(i=0; i<=N; i++) { f[i] = i; r[i] = 0; } while(T--) { int x, y, d; scanf("%d%d%d", &d, &x, &y); int rx = Find(x), ry = Find(y); if(x>N || y>N || (d==2&&x==y) ) ans++; else if(rx == ry && (r[y]+d-1)%3 != r[x]) ans++; else if(rx != ry) { f[rx] = ry; r[rx] = ((d-1)-r[x]+r[y]+3)%3; } } printf("%d\n", ans); return 0; }
原文:http://www.cnblogs.com/zhengguiping--9876/p/4677668.html