#include<iostream> #include<cstring> #include<cstdio> using namespace std; int relation[50010],f[50010]; int n,k,sum=0; void init(); void merge(int,int,int,int,int); int find(int); void work(); int main() { init(); work(); return 0; } void init() { memset(relation,0,sizeof(relation)); cin>>n>>k; for(int i=1;i<=n;i++) f[i]=i; } void work() { int d,x,y; for(int i=1;i<=k;i++) { cin>>d>>x>>y; if(x>n||y>n) { sum++; continue; } if(n==2 && x==y) { sum++; continue; } int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) merge(fx,fy,x,y,d); else if((relation[y]+3-relation[x])%3!=(d-1)) sum++; } cout<<sum<<endl; } int find(int x) { if(f[x]==x) return x; int fx; fx=find(f[x]);//不能直接f[x]=find(f[x]),更新f[x]后就无法计算x和根的关系了; relation[x]=(relation[x]+relation[f[x]])%3; f[x]=fx;//路径压缩 return f[x]; } void merge(int fx,int fy,int x,int y,int d) { f[fy]=fx; relation[fy]=(3-relation[y]+d-1+relation[x])%3; } /************************************************************** Problem: 2238 User: admin Language: C++ Result: Accepted Time:220 ms Memory:2468 kb ****************************************************************/