題目鏈接:
題目解析:
就是用3倍的並查積的存各種動物的關係
一倍存本身,二倍存獵物,三倍存天敵
AC代碼:
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int fa[300005];
int n,k,ans;
int getfa(int x)
{
if(x!=fa[x]) fa[x]=getfa(fa[x]);
return fa[x];
}
int unity(int x,int y)
{
int r1=getfa(fa[x]),r2=getfa(fa[y]);
fa[r1]=r2;
}
int main()
{
int x,y,z;
cin>>n>>k;
for(int i=1;i<=3*n;++i) fa[i]=i;
for(int i=1;i<=k;++i)
{
cin>>z>>x>>y;
if(x>n||y>n) {ans++; continue;}
if(z==1)
{
if(getfa(x+n)==getfa(y)||getfa(x+2*n)==getfa(y))
{
ans++;
continue;
}
unity(x,y);
unity(x+n,y+n);
unity(x+2*n,y+2*n);
}
else if(z==2)
{
if(x==y) {ans++; continue;}
if(getfa(x)==getfa(y)||getfa(x+2*n)==getfa(y))
{
ans++;
continue;
}
unity(x,y+2*n);
unity(x+n,y);
unity(x+2*n,y+n);
}
}
cout<<ans<<endl;
return 0;
}