传送门
思路参考自 http://blog.youkuaiyun.com/niushuai666/article/details/6981689
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=50000+10;
int n,k;
//relation[i]为0表示当前i与其根节点直接的关系是同类,1 表示被根节点吃,2表示吃根节点
int fa[maxn],relation[maxn];
int find(int x){
if (x==fa[x])return x;
int tmp=fa[x];
fa[x]=find(fa[x]);
relation[x]=(relation[x]+relation[tmp])%3;
return fa[x];
}
void init(){
for (int i=0;i<=n;i++){
fa[i]=i;
relation[i]=0;
}
}
int main()
{
scanf ("%d%d",&n,&k);
init();
int ans=0;
int d,x,y;
while (k--){
scanf ("%d%d%d",&d,&x,&y);
if (x>n||y>n){
ans++;continue;
}
if(d==2){
if (x==y){
ans++;continue;
}
}
int fx=find(x);
int fy=find(y);
if (fx!=fy){
fa[fy]=fx;//fx->fy
//relation[fy]=fx->fy ==> fx->x + x->y + y->fy ==> relation[x]+(d-1)+3-relation[y]
relation[fy]=((relation[x]+d-1+3-relation[y])%3+3)%3;
}else {
int tmp=((3-relation[x]+relation[y])%3);
if (d==1&&relation[x]!=relation[y]){
ans++;
continue;
}
if (d==2&&tmp!=d-1){
ans++;
continue;
}
}
}
printf ("%d\n",ans);
return 0;
}