作业帮 > 综合 > 作业

北大acm1182食物链的解题思路?

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/05/07 20:43:49
北大acm1182食物链的解题思路?
题目在此 http://acm.pku.edu.cn/JudgeOnline/problem?id=1182
让我看明白了,提交成功了的话!还会再加分的。
使用树结构不能理解!
二维数组只是理解了一点点,
望再给我详细解释!
北大acm1182食物链的解题思路?
#include
struct tagNode
{
int parent;
int rank;
}a[50001];
int F(int x)
{
int t = a[x].parent;
if (t == 0)
return x;
a[x].parent = F(t);
a[x].rank += a[t].rank;
a[x].rank %= 3;
return a[x].parent;
}
int main()
{
int cnt = 0, d, k, n, x, y;
scanf("%d%d", &n, &k);
for (int i = k; i > 0; )
{
--i;
scanf("%d%d%d", &d, &x, &y);
if (x > n || y > n)
++cnt;
else if (d == 1)
{
int hx = F(x), hy = F(y);
if (hx != hy)
{
a[hx].parent = hy;
a[hx].rank = a[y].rank - a[x].rank;
if (a[hx].rank < 0)
a[hx].rank += 3;
}
else if (a[x].rank != a[y].rank)
++cnt;
}
else
{
if (x == y) ++cnt;
else
{
int hx = F(x), hy = F(y);
if (hx != hy)
{
a[hx].parent = hy;
a[hx].rank = (a[y].rank - a[x].rank + 4) % 3;
}
else if (a[x].rank != (a[y].rank + 1) % 3)
++cnt;
}
}
}
printf("%d\n", cnt);
}