Luogu P2024 [NOI2001]食物链

#include<cstdio>
#include<cstring>
using namespace std;

int n,k,fa[1000005],ans;

inline int getfa(int v){
	return fa[v]==v?v:fa[v]=getfa(fa[v]);
}

inline void merge(int x,int y){
	x=getfa(x);y=getfa(y);
	if(x!=y)fa[y]=x;
}

inline bool family(int x,int y){
	return getfa(x)==getfa(y);
}

int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=3*n;i++)fa[i]=i;
	for(int i=1;i<=k;i++){
		int opt,x,y;
		scanf("%d%d%d",&opt,&x,&y);
		if(x>n||y>n){ans++;continue;}
		if(opt==1){
			if(family(x,y+n)||family(x,y+2*n)){ans++;continue;}
			merge(x,y);
			merge(x+n,y+n);
			merge(x+2*n,y+2*n);
		}
		else{
			if(x==y){ans++;continue;}
			if(family(x+2*n,y)||family(x,y)){ans++;continue;}
			merge(x+n,y);
			merge(x,y+2*n);
			merge(x+2*n,y+n);//是个环:猎物的猎物是天敌 
		}
	}
	printf("%d\n",ans);
}
//x+n:猎物 x+2*n:天敌 
posted @ 2019-08-29 10:04  Y15BeTa  阅读(96)  评论(0编辑  收藏  举报