POJ1182 食物链————并查集

#include<iostream> #include<string.h> typedef struct n { int f; int rel; }node; node data[50010]; int K,N; int findp(int x) { int tmp_p=data[x].f; if(tmp_p!=x) { int root=findp(tmp_p); data[x].f=root; data[x].rel=(data[x].rel+data[tmp_p].rel)%3; } return data[x].f; } void unions(int x,int y,int t) { int i=findp(x); int j=findp(y); data[i].f=j; if(t==1) data[i].rel=(data[y].rel-data[x].rel+6+1)%3; //对的 else data[i].rel=(data[y].rel-data[x].rel+6)%3; } int main() { int i,j,k,res=0,t; scanf("%d%d",&N,&K); for(i=0;i<=50000;i++) { data[i].f=i; data[i].rel=0; } for(i=0;i<K;i++) { scanf("%d%d%d",&t,&j,&k); if(j>N||k>N||(t==2&&j==k)) { res++; continue; } if(t==1) { if(findp(j)!=findp(k)) unions(j,k,0); else if(data[j].rel!=data[k].rel) { res++; } } else { if(findp(j)!=findp(k)) unions(j,k,1); else if((data[k].rel-data[j].rel+6+1)%3!=0) { res++; } } } printf("%d/n",res); return 0; }

你可能感兴趣的:(POJ1182 食物链————并查集)