emmm~没什么好说的,看代码注释吧~
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn = 5e4 + 5;
int f[maxn * 3], n, k, ans = 0;
int find(int x) {
if (f[x] == x)
return x;
return f[x] = find(f[x]);
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= 3 * n; i++)//n是自己,x+n是猎物,x+2n是天敌
f[i] = i;
int t, x, y;
while (k--) {
scanf("%d%d%d", &t, &x, &y);
if (x > n || y > n || x < 1 || y < 1) {
ans++; continue;
}
if (t == 1) {
if (find(x + n) == find(y) || find(x + 2 * n) == find(y)) {
//若y是x的猎物或天敌
ans++; continue;
}
//同类合并
f[find(x)] = find(y);
f[find(x + n)] = find(y + n);
f[find(x + 2 * n)] = find(y + 2 * n);
}
else{
if (find(x) == find(y) || find(x + 2 * n) == find(y)) {
//若x和y是同类或者y是x的天敌
ans++; continue;
}
f[find(x)] = find(y + 2 * n);//x是y的天敌
f[find(x + n)] = find(y);//y是x的猎物
f[find(x + 2 * n)] = find(y + n);//y的猎物是x的天敌
}
}
printf("%d\n", ans);
system("pause");
return 0;
}