poj 食物链 种类并查集
wa 还没找出哪里的错误 先放这里
#include<iostream> #include<stdio.h> #include<cstring> #include<cstdlib> #include<queue> #include<math.h> #include<algorithm> using namespace std; int n,m; struct node { int f,k; } p[50002]; int find1(int x) // { if(p[x].f==x) { p[x].k=0; return p[x].f=x; } int fa=find1(p[x].f); p[x].k=(p[x].k+p[p[x].f].k)%3; return p[x].f=fa; } int main() { int z,a,b; while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n; i++) // 0相同 1根吃x 2 x吃根 { p[i].f=i; p[i].k=0; } int ans=0;//假话种类数 while(m--) { scanf("%d%d%d",&z,&a,&b); if(a>n || b>n ||(a==b && z==2)) ans++; else { int aa=find1(a); int bb=find1(b); if(aa==bb) { if((p[b].k-p[a].k+3)%3!=(z-1)) ans++; } else { p[bb].f=aa; p[bb].k=(p[a].k-p[b].k+z2)%3; } } } printf("%d\n",ans); } return 0; }