#include<iostream>
#include<cstdio>
using namespace std;
const int N = 100000;
int s[N*3+1];
int n,k;
void init_set(){
for(int i= 1;i<=3*n;i++){
s[i] = i;
}
}
int find_set(int x){
if(x==s[x])return x;
s[x]=find_set(s[x]);
return s[x];
}
void union_set(int x,int y){
s[find_set(y)] = find_set(x);
}
int main(){
cin>>n>>k;
init_set();
int count=0;
for(int i=1;i<=k;i++){
int mode,a,b;
getchar();
cin>>mode>>a>>b;
if(a>n||b>n){
count++;continue;
}
if(mode==2&&a==b){
count++;continue;
}
if(mode==1){//a,b是同类
if((find_set(a)==find_set(b+n)) || (find_set(a+n)==find_set(b+n*2)) || (find_set(a+2*n)==find_set(b))){
count++;continue;
}//a chi b
if((find_set(b)==find_set(a+n)) || (find_set(b+n)==find_set(a+n*2)) || (find_set(b+2*n)==find_set(a))){
count++;continue;
}//b chi a
// if((find_set(b)==find_set(a+n)) || (find_set(a)==find_set(b+2))){
// count++;continue;
// }
union_set(a,b);
union_set(a+n,b+n);
union_set(a+2*n,b+2*n);
}
else{//a吃b
if((find_set(b)==find_set(a+n)) || (find_set(b+n)==find_set(a+n*2)) || (find_set(b+2*n)==find_set(a))){
count++;continue;
}//b chi a
if((find_set(b)==find_set(a)) || (find_set(b)==find_set(a)) || (find_set(b)==find_set(a))){
count++;continue;
}
// if((find_set(a)==find_set(b)) || (find_set(a+n)==find_set(b+n*2))){
// count++;continue;
// }
union_set(a,b+n);
union_set(a+n,b+2*n);
union_set(a+2*n,b);
}
}
cout<<count<<endl;
return 0;
}
并查集——食物链
最新推荐文章于 2022-04-11 15:11:04 发布