并查集 POJ - 1182 食物链

版权声明:转载请注明出处 https://blog.csdn.net/qq_43590432/article/details/88321219

食物链

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_43590432/article/details/88321219
今日推荐