扩展域并查集
分为同类域,捕食域,天敌域
#include<cstdio>
using namespace std;
const int maxn = 5e4 + 5;
int prt[3*maxn];
int getpa(int x)
{
return x == prt[x] ? x : prt[x] = getpa(prt[x]);
}
int main()
{
int n, k, op, x, y, ans = 0;
scanf("%d%d",&n,&k);
for(int i = 1; i <= 3*n; i++) prt[i] = i;
for(int i = 1; i <= k; i++){
scanf("%d%d%d",&op,&x,&y);
if(x > n || y > n){
ans++;
continue;
}
if(op == 1){
if(getpa(x) == getpa(y+n) || getpa(x+n) == getpa(y) || getpa(x+2*n) == getpa(y) || getpa(x) == getpa(y+2*n)){
ans++;
continue;
}
prt[getpa(y)] = getpa(x);
prt[getpa(y+n)] = getpa(x+n);
prt[getpa(y+2*n)] = getpa(x+2*n);
}
else{
if(getpa(x) == getpa(y) || getpa(x) == getpa(y+n)){
ans++;
continue;
}
prt[getpa(x+n)] = getpa(y);
prt[getpa(x+2*n)] = getpa(y+n);
prt[getpa(x)] = getpa(y+2*n);
}
}
printf("%d\n",ans);
return 0;
}