参考:http://blog.youkuaiyun.com/niushuai666/article/details/6981689
#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 50005
struct Node
{
int pre, re;
}bin[maxn];
int find(int x)
{
if (bin[x].pre==x)
return x;
int temp = bin[x].pre;//路径压缩
bin[x].pre = find(temp);//find()返回根结点
bin[x].re = (bin[x].re + bin[temp].re) % 3;//x通过temp与根结点建立关系
return bin[x].pre;//返回根结点
}
int main()
{
int n, k, d, a, b;
scanf("%d%d", &n, &k);
for (int i=1; i<=n; ++i)
bin[i].pre = i, bin[i].re = 0;
int sum = 0;
while (k--)
{
scanf("%d%d%d", &d, &a, &b);
if ( a>n || b>n ||(d==2 && a==b) )
{
++ sum;
continue;
}
int root1 = find(a), root2 = find(b);
if (root1!=root2)
{
//把root1并到root2上
//root2->root1=root2->b + b->a + a->root1
bin[root1].pre = root2;
bin[root1].re = ( bin[b].re + 3-(d-1) + 3-bin[a].re ) % 3;
//把root2并到root1上
//root1->root2=root1->a + a->b + b->root2
// bin[root2].pre = root1;
// bin[root2].re = ( bin[a].re + d-1 + 3-bin[b].re ) % 3;
}
else//root1==root2
{
if (d==1 && bin[a].re!=bin[b].re)
{
++ sum;
continue;
}
if (d==2 && (3-bin[a].re + bin[b].re)%3 != 1)//a->b = a->root1 + root2->b
{
++ sum;
continue;
}
}
printf("%d\n", sum);
}
return 0;
}