并查集 POJ - 1182 食物链
#include<bits/stdc++.h>
using namespace std;
#define maxn 50005
int n,k;//n个动物,k句话
int d,x,y;//x y间关系为d
int p[3*maxn];//集合
int ans=0;//计数
int dsu(int x1) {
return p[x1]==x1 ? x1 : p[x1]=dsu(p[x1]);
}
void unity(int x1,int y1){
x1=dsu(x1),y1=dsu(y1);
p[x1]=y1;
}
int main(){
cin>>n>>k;
for(int i=1;i<=3*n;i++){//i为动物,i+n为i动物的猎物,i+2n为i的天敌
p[i]=i;
}
while(k--){
cin>>d>>x>>y;
if(x>n||y>n){
ans++;
continue;
}
if(d==1){
if(dsu(x+n)==dsu(y)||dsu(x+2*n)==dsu(y)){//如果x的猎物是y,或x的天敌是y ,那么是假话
ans++;
continue;
}
//x的同类是y的同类,x的天敌是y的天敌,x的猎物是y的猎物
unity(x,y);
unity(x+n,y+n);
unity(x+2*n,y+2*n);
}
else{
if(dsu(x)==dsu(y)||dsu(x+2*n)==dsu(y)){//如果x,y是同类,或x的天敌是y ,那么是假话
ans++;
continue;
}
//x的猎物和y是同类,x和y的天敌的同类,x的天敌和y的猎物是同类
unity(x+n,y);
unity(x,y+2*n);
unity(x+2*n,y+n);
}
}
cout<<ans<<endl;
return 0;
}