看了看题解,感觉一样啊
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int f[3*N],n,m;
int ans;
int find(int x){return f[x]==x?x:(f[x]=find(f[x]));}
void un_1(int x,int y)
{
f[x]=y;
f[find(x+n)]=find(y+n);
f[find(x+2*n)]=find(y+2*n);
return ;
}
void un_2(int x,int y)
{
f[find(x)]=find(y+2*n);
f[find(x+n)]=find(y);
f[find(y+2*n)]=find(x);
return ;
}
int c,x,y;
int main()
{
cin>>n>>m;
for (int i = 1; i <= n*3; i++)f[i] = i;
while(m--){
cin>>c>>x>>y;
if( x>n || y>n ){
ans++;
continue;
}
if(c==1){
if(find(x+n) == find(y) || find(x) == find(y+n))ans++;
else un_1(x,y);
}
else {
if(x == y)ans++;
else if(find(x) == find(y)||find(x) == find(y+n)) ans++;
else un_2(x,y);
}
}
cout<<ans<<endl;
return 0;
}