2011-06-01 22:02:11 题目地址:http://poj.org/problem?id=1182 #include<iostream> #define N 50010 using namespace std; int animal[N],flink[N],n,r; bool root[N]; void INIT() { int i; for(i=1;i<=n;i++) { animal[i]=root[i]=1; flink[i]=0; } } int getZ(int x) { int z=0; while(!root[x]) {z+=flink[x]; if(z>=2) z=-1; else if(z<=-2) z=1;x=animal[x];} r=x; return z; } void UNION(int rx,int ry,int z) { if(animal[rx]>animal[ry]) { animal[rx]+=animal[ry]; animal[ry]=rx; root[ry]=0; flink[ry]=-z; } else { animal[ry]+=animal[rx]; animal[rx]=ry; root[rx]=0; flink[rx]=z; } } int main() { int ans,k,x,y,d,zx,zy,rx,ry,z; scanf("%d%d",&n,&k); { INIT(); ans=0; while(k--) { scanf("%d%d%d",&d,&x,&y); if(x>n||y>n) ans++; else { if(x==y&&d==2) ans++; else { zx=getZ(x); rx=r; zy=getZ(y); ry=r; if(rx!=ry) { z=-zx+d-1; if(z>=2) z=-1; else if(z<=-2) z=1; z+=zy; if(z>=2) z=-1; else if(z<=-2) z=1; UNION(rx,ry,z); } else { z=zx-zy; if(z>=2) z=-1; else if(z<=-2) z=1; if(z!=d-1) ans++; } } } } printf("%d/n",ans); } return 0; }