环形的关系,A并查集表示同类,B表示x捕食y,C类表示x被y捕食
最后,POJ上莫名的多组数据WA,cin会TLE
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int maxn=50005;
int fa[maxn*3];
void init(){
for(int i=0;i<maxn*3;i++){
fa[i]=i;
}
}
int find(int a){
if(a==fa[a]) return a;
else return fa[a]=find(fa[a]);
}
void merge(int a,int b){
int aa=find(a),bb=find(b);
if(aa!=bb){
fa[aa]=bb;
}
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
// while(cin>>n>>m){
int t,x,y;
int ans=0;
init();
for(int i=0;i<m;i++){
scanf("%d %d %d",&t,&x,&y);
if(x>n||y>n||y<=0||x<=0){
ans++;
continue;
}
if(t==1){
if(find(x)==find(y+maxn)||find(x)==find(y+2*maxn)){
ans++;
continue;
}
else{
merge(x,y);
merge(x+maxn,y+maxn);
merge(x+2*maxn,y+2*maxn);
}
}
else{
if(find(x)==find(y)||find(x)==find(y+2*maxn)){
ans++;
continue;
}
else{
merge(x,y+maxn);
merge(x+maxn,y+2*maxn);
merge(x+2*maxn,y);
}
}
}
cout<<ans<<endl;
// }
return 0;
}