ybtoj并查集例题4食物链
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj并查集例题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食物链的主要内容,如果未能解决你的问题,请参考以下文章
带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代