题目:click
x吃x+n,x+n吃x+2*n, x+2*n吃x
如果x吃y,那么y将会和x+n出现在同一集合中,同理x会出现在y+2*n所在的集合。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=50005;
int fa[3*N];
void init(int n){
for(int i=1;i<=3*n;i++){
fa[i]=i;
}
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void Union(int x,int y){
fa[find(x)]=find(y);
}
int main(){
int n,k; cin>>n>>k;
init(n);
long long ans=0;
while(k--){
int id,a,b; cin>>id>>a>>b;
if(a>n||b>n){
ans++; continue;
}
if(id==1){
if(find(a)==find(b+n)||find(a)==find(b+2*n)){
ans++; continue;
}
Union(a,b);
Union(a+n,b+n);
Union(a+2*n,b+2*n);
}
else{
if(find(a)==find(b)||find(a)==find(b+n)){
ans++; continue;
}
Union(a,b+2*n);
Union(a+n,b);
Union(a+2*n,b+n);
}
}
cout<<ans<<endl;
return 0;
}