#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 500010;
int n,k;
int p[N],d[N];
int find(int x)
{
if(p[x]!=x)
{
int u = p[x]; // u记录旧的父节点
p[x] = find(p[x]); // 路径压缩,新父节点变成根节点了
d[x] += d[u]; // x到新父节点的距离等于x到旧父节点的距离加上旧父节点到根节点的距离
}
return p[x];
}
int main(void)
{
cin >> n >> k;
for(int i=1;i<=n;i++)
p[i]=i; // 并查集初始化
int res=0;
while(k--)
{
int t,x,y;
cin >>t >>x >>y;
if(x>n||y>n) res++;
else
{
int px = find(x),py = find(y);
if(t==1)
{
if(px==py&&(d[x]-d[y])%3) res++;
else if(px!=py)
{
p[px]=py;
d[px] = d[y]-d[x];
}
}
else
{
if(px==py&&(d[x]-d[y]-1)%3) res++;
else if(px!=py)
{
p[px] = py;
d[px] = d[y]+1-d[x];
}
}
}
}
cout << res << endl;
return 0;
}
感谢查看,喜欢就点个赞吧!