这题很明显总共有三种关系:
1、x与y同类
2、x吃y
3、y吃x
所以这时候,如果只有一个域就不能表示这3种关系了,比如将(x,y)合并,那么这时候是x,y哪种关系呢? 所以这时候我们就要将这一个点扩展为3个点。 同类域,吃域,被吃域。
具体看代码吧:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 50001;
int pre[N*3];
void init(int n)
{
for(int i=0;i<=n*3;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(x==pre[x]) return x;
else
return pre[x]=find(pre[x]);
}
void Union(int x,int y)
{
int rootx = find(x);
int rooty = find(y);
if(rootx!=rooty)
{
pre[rootx]=rooty;
}
return ;
}
int main()
{
int n,k,x,y,op,ans;
cin>>n>>k;
ans=0;
init(n);
for(int i=0;i<k;i++)
{
cin>>op>>x>>y;
if(x>n||y>n)
{
ans++;
continue;
}
if(op==1)
{
if(find(x+n)==find(y) || find(x)==find(y+n))
{
ans++;
}
else{
Union(x,y);
Union(x+n,y+n);
Union(x+2*n,y+2*n);
}
}
if(op==2)
{
if(x==y)
{
ans++; continue;
}
if(find(x)==find(y)||find(y)==find(x+n))
{
ans++;
}
else{
Union(x,y+n);
Union(x+n,y+n+n);
Union(x+2*n,y);
}
}
}
cout<<ans<<endl;
return 0;
}