就是把某一动物类的祖宗节点直接对A或B或C赋值*//就是把某一动物类的祖宗节点直接对A或B或C赋值
#include<iostream>
const int N = 5e5 + 10;
using namespace std;
int pre[N], ans, A, B, C;
int find(int x) {//找到x的父亲加路径压缩=>直接返回x的祖宗节点
if(x != pre[x])pre[x] = find(pre[x]);
return pre[x];
}
bool eat_c(int x, int y){//判断是否存在食物链上的关系
if ((x == y) && (x == A || x == B || x == C))return false;
if ((x == A || x == C || x == B) && (y == A || y == B || y == C))return true;
return false;
}
bool check(int x, int y) {//检查是否违反之前的食物链关系
if (!A && !B){//如果没有先创建A,B;
A = x, B = y;
return true;
}
if (!C) {//没有C先创建
if (x == B) {
C = y;
return true;
}
else if (y == A) {
C = x;
return true;
}
}
if (x == A) {
if (y != B)return false;
return true;
}
else if (x == B) {
if (y != C)return false;
return true;
}
else if (x == C) {
if (y != A)return false;
return true;
}
return false;
}
int main() {
int n, k; cin >> n >> k;
for (int i = 1; i <= n; i++)pre[i] = i;
int d, x, y;
while (k--) {
cin >> d >> x >> y;
if (d == 1) {
if (x > n || y > n)ans++;
else if (eat_c(find(x), find(y)))ans++;//判断是否有食物链上的关系
else {//检查所在食物链的位置,并更新食物链位置;合并同类
if (find(x) == A)A = find(y);
else if (find(x) == B)B = find(y);
else if (find(x) == C)C = find(y);
pre[find(x)] = find(y);
}
}
if (d == 2) {
if (x > n || y > n)ans++;
else if (find(x) == find(y))ans++;//是否为同类
else if(!check(find(x), find(y)))ans++;//检查是否违反之前的食物链规则
}
}
cout << ans;
return 0;
}