ybtoj并查集例题4食物链

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj并查集例题4食物链相关的知识,希望对你有一定的参考价值。

【例题4】食物链


Link

传送门
题目


解题思路

设x+n是吃x的,x吃x+2*n,y同上
对于给出的两种关系,我们把一种可能的a、b、c列出来
在这里插入图片描述
在这里插入图片描述

PS:此处的a、b、c只是代表它们的关系,代表了谁吃谁、谁和谁同类,并不是一定是这种排列


Code

#include <iostream>
#include <cstdio>

using namespace std;

int fa[150100], n, m, c, x, y, ans;
int x0, y0, x1, y1, x2, y2, flag;

int find(int x) {
	if (fa[x] == x) return x;
	fa[x] = find(fa[x]);
	return fa[x];
}

int main() {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= 3 * n; i++)
		fa[i] = i;
	for (int i = 1; i <= m; i++) {
		scanf("%d %d %d", &c, &x, &y);
		if (x > n || y > n || (c == 2 && x == y)) {  //先把基础的假话做了
			ans++;
			continue;
		}
		
		flag = 1;
		x0 = find(x), y0 = find(y);                   //x(x0), y(y0)
		x1 = find(x + n), y1 = find(y + n);           //x+n(x1), y+n(y1)             x/y + s*n (x/y s)这样还挺对应的
		x2 = find(x + 2 * n), y2 = find(y + 2 * n);   //x+2*n(x2), y+2*n(y2)
		
		if (c == 1) {  //保险起见,我把所有的对应
			if (x1 == y0 || x1 == y2 || x0 == y1 || x0 == y2 || x2 == y1 || x2 == y0) {
				ans++, flag = 0;
			}
		} else {
			if (x1 == y1 || x1 == y0 || x0 == y0 || x0 == y2 || x2 == y1 || x2 == y2) {
				ans++, flag = 0;
			}
		}
		
		if (!flag) continue;
		
		if (c == 1) {   //把同类并查集
			fa[x0] = y0, fa[x1] = y1, fa[x2] = y2;
		} else {
			fa[x0] = y1, fa[x2] = y0, fa[x1] = y2;
		}
	}
	printf("%d", ans);
}

以上是关于ybtoj并查集例题4食物链的主要内容,如果未能解决你的问题,请参考以下文章

ybtoj并查集例题2程序自动分析

ybtoj并查集例题3银河英雄传说

带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代

并查集例题02.带权并查集(poj1182)

poj1182食物链_并查集_挑战程序设计竞赛例题

带权并查集——食物链