洛谷 P2024 [NOI2001]食物链

题意简述

有人用两种说法对这 N 个动物所构成的食物链关系进行描述:
1.“1 X Y”,表示 X 和 Y 是同类。
2.“2 X Y”,表示 X 吃 Y 。
有出 K 句话,这 K 句话有的是真的,有的是假的。
当前的话与前面的某些真的话冲突,就是假话
当前的话中 X 或 Y 比 N 大,就是假话
当前的话表示 X 吃 X,就是假话
输出假话的总数。

题解思路

开三个并查集,
“x吃y”的关系

merge(x, y+n);merge(x+n,y+2n);merge(x+2n,y);

“x和y是同类”的关系

merge(x,y);merge(x+n,y+n);merge(x+2n,y+2n);

代码

#include <cstdio>
int n, k, opt, x, y, N, ans, x1, x2, x3, y1, y2, y3;
int f[200000];
int find(const int &x) {return f[x] == x ? x : f[x] = find(f[x]); }
int main()
{
	scanf("%d%d", &n, &k);
	N = n * 3;
	for (register int i = 1; i <= N; ++i) f[i] = i;
	for (register int i = 1; i <= k; ++i)
	{
		scanf("%d%d%d", &opt, &x, &y);
		if (x > n || y > n) ++ans;
		else
		{
			x1 = find(x); x2 = find(x + n); x3 = find(x + n * 2);
			y1 = find(y); y2 = find(y + n); y3 = find(y + n * 2);
			if (opt == 1)
				if (x1 == y2 || x2 == y1) ++ans;
				else {f[x1] = y1; f[x2] = y2; f[x3] = y3; }
			else
				if (x1 == y1 || x2 == y1) ++ans;
				else {f[x1] = y2; f[x2] = y3; f[x3] = y1; }
		}
	}
	printf("%d\n", ans);
}
posted @ 2018-09-11 15:19  xuyixuan  阅读(150)  评论(0)    收藏  举报