//用三倍并查集表示三种动物,根据描述去找根,相邻关系为左吃右。无需确定具体ABC,只要关系定了即可。
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 50003;
int f[3*maxn];
int Find(int a){
if(f[a] == a) return a;
return f[a] = Find(f[a]);
}
int main(){
int n,k,ans = 0;
cin>>n>>k;
for(int i = 1;i <= 3*n;i++) f[i] = i;
while(k--){
int d,x,y;
cin>>d>>x>>y;
if(x < 1 || y < 1 || x > n || y > n){
ans++;
continue;
}
if(d == 2 && x == y){
ans++;
continue;
}
int fx1 = Find(x), fx2 = Find(x+n), fx3 = Find(x+2*n);//1表示自己,2表示吃1的,3表示吃2的。
int fy1 = Find(y), fy2 = Find(y+n), fy3 = Find(y+2*n);
if(d == 1){
if(fx1 == fy2 || fx1 == fy3){
ans++;
continue;
}
else f[fx1] = fy1, f[fx2] = fy2, f[fx3] = fy3;
}
else{
if(fx1 == fy1 || fx1 == fy3){
ans++;
continue;
}
else f[fx1] = fy2, f[fx2] = fy3, f[fx3] = fy1;//
}
}
cout<<ans<<endl;
return 0;
}
CODEVS 1074 食物链
最新推荐文章于 2017-10-28 10:52:14 发布