通过三倍空间记录这个吃谁,谁是同类的情况,注意数组大小。并查集的部分非常典型。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5;
int n,k;
int fa[maxn];
int find(int x){
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
bool check(int op,int x,int y){
if(x>n||y>n)return true;//X或Y比N大
if(x==y&&op==2)return true;//X吃X
if(op==1){
if(find(x+n)==find(y)||find(x)==find(y+n))return true;
}else{
if(find(y+n)==find(x)||find(x)==find(y))return true;
}
return false;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n*3;i++){
fa[i]=i;
}
int ans=0;//记录假话的数量
while(k--){
int op,x,y;
cin>>op>>x>>y;
if(check(op,x,y))ans++;
else{
if(op==1){
fa[find(x)]=find(y);
fa[find(x+n)]=find(y+n);
fa[find(x+2*n)]=find(y+2*n);
}else{
fa[find(x)]=find(y+2*n);
fa[find(x+n)]=find(y);
fa[find(x+2*n)]=find(y+n);
}
}
}
cout<<ans<<endl;
return 0;
}