作者:百脑汇惠州店_956 | 来源:互联网 | 2024-12-15 20:48
本题探讨了一个生物链模型,其中每个生物x可以捕食x+n的生物,而x+n又捕食x+2*n的生物,形成一个循环的食物链。当x捕食y时,y和x+n会被归类到同一个集合中,同样地,x也会被归入y+2*n所在的集合。
问题描述:
在本题中,我们考虑一种特殊的生物关系网络,即生物 x 可以捕食 x+n 的生物,x+n 又可以捕食 x+2*n 的生物,最终 x+2*n 又能捕食 x,形成一个闭环的食物链结构。此外,若 x 能够捕食 y,则 y 与 x+n 将被视为同一组群,同时 x 也将被划分至 y+2*n 的组群中。
解决方案:
为了解决这个问题,我们可以使用并查集(Disjoint Set Union, DSU)来管理这些生物之间的关系。通过初始化并查集,并根据输入的操作来合并不同的生物群体,我们可以有效地追踪哪些生物属于同一组群,从而判断是否存在矛盾的捕食关系。
代码实现:
#include
using namespace std;
const int MAX_N = 50005;
int parent[3 * MAX_N];
void initialize(int n) { for (int i = 1; i <= 3 * n; ++i) { parent[i] = i; } }
int find(int x) { return parent[x] == x ? x : parent[x] = find(parent[x]); }
void merge(int x, int y) { parent[find(x)] = find(y); }
int main() {
int n, k; cin >> n >> k; initialize(n); long long cOnflicts= 0;
while (k--) {
int operation, a, b; cin >> operation >> a >> b;
if (a > n || b > n) { conflicts++; continue; }
if (operation == 1) {
if (find(a) == find(b + n) || find(a) == find(b + 2 * n)) { conflicts++; continue; }
merge(a, b); merge(a + n, b + n); merge(a + 2 * n, b + 2 * n);
} else {
if (find(a) == find(b) || find(a) == find(b + n)) { conflicts++; continue; }
merge(a, b + 2 * n); merge(a + n, b); merge(a + 2 * n, b + n);
}
}
cout <}