并查集经典题
1. 向量的思考模式
2. 再计算向量时,要画图;有一个关系一开始写错了
3. 本人的norm函数一开始x >= 3写成了 x>3,应该对这种小函数多做UT(口头上的,比如)
4. 可以把father set一开始memset为-1
参考链接
http://blog.csdn.net/tiantangrenjian/article/details/7085575
http://pdjlzs.diandian.com/post/2012-02-03/15719424
#include <iostream>
using namespace std; #define ANI_MAX (50000 + 10) int ss[ANI_MAX];
int rk[ANI_MAX]; int norm(int x)
{
if (x >= 3)
{
x = x % 3;
}
else if (x < 0)
{
while (x < 0)
{
x += 3;
}
}
return x;
} void init()
{
for (int i = 0; i < ANI_MAX; i++)
{
ss[i] = i;
}
memset(rk, 0, sizeof(rk));
} int find(int x)
{
if (ss[x] == x)
{
return x;
}
else
{
int r = find(ss[x]);
rk[x] = norm(rk[x] + rk[ss[x]]);
ss[x] = r;
return r;
}
} bool merge(int x, int y, int type)
{
int fx = find(x);
int fy = find(y);
if (fx == fy)
{
if (norm(rk[y] - rk[x]) != type)
{
return true;
}
else
{
return false;
}
} ss[fy] = fx;
rk[fy] = norm(rk[x] - rk[y] + type);
return false;
} int main(void)
{
int n;
int k;
scanf("%d %d",&n,&k);
int error = 0;
init();
for (int i = 0; i < k; i++)
{
int d;
int x;
int y;
scanf("%d %d %d",&d,&x,&y);
if (x > n || y > n || (d == 2 && x == y))
{
error++;
continue;
}
else if (merge(x, y, d - 1))
{
error++;
} } cout << error << endl; return 0;
}