地址 http://poj.org/problem?id=1182

题解

可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用

每个动物都有三个并查集 自己 天敌 捕食 并查集

那么在获得一条信息后 我们先判断真伪

x不能吃x 自己

x y不能超过数目类型

当xy是同一类的时候  x不会出现在y的天敌和捕食并查集中(其中已经包含 y不会出现在x的天敌和捕食并查集中)

确认为真后 合并更新 x y 的同类并查集   天敌并查集和 不是并查集

当x吃y的信息, 则 x不会出现在y的同类和捕食并查集中(已经包含y不会出现在x同类且y不会出现在x的天敌并查集中)

确认为真后 合并更新 x和y的天敌并查集 合并更新 x的天敌与y的捕食并查集 合并更新x的捕食与y的并查集

代码

 #include <iostream>
#include <algorithm>
#include <vector> using namespace std; const int MAX_N = ; int par[MAX_N]; //父节点
int rankk[MAX_N]; //树的高度 //初始化n个元素
void init(int n)
{
for (int i = ; i < n; i++) {
par[i] = i;
rankk[i] = ;
}
} //查询树的根
int find(int x) {
if (par[x] == x) {
return x;
}
else {
return par[x] = find(par[x]);
}
} //合并x和y所属于的集合
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return; if (rankk[x] < rankk[y]) {
par[x] = y;
}
else {
par[y] = x;
if (rankk[x] == rankk[y]) rankk[x]++;
}
} //判断x和y是否属于同一个集合
bool same(int x, int y) {
return find(x) == find(y);
}
//=============================================================
int N, K;
int T[MAX_N], X[MAX_N], Y[MAX_N]; void solve()
{
//初始化并查集
//元素x ,x+N,x+2*N分别代表x-A x-B x-C
init(N * ); int ans = ;
for (int i = ; i < K; i++) {
int t = T[i];
int x = X[i] - , y = Y[i] - ; //不正确的编号
if (x < || N <= x || y < || N <= y) {
ans++;
continue;
} if (t == ) {
//xy属于同一类
if (same(x, y + N) || same(x, y + * N)) {
ans++;
}
else {
unite(x, y);
unite(x + N, y + N);
unite(x + * N, y + * N);
}
}
else {
//x吃y
if (same(x, y) || same(x, y + * N)) {
ans++;
}
else {
unite(x, y + N);
unite(x + N, y + * N);
unite(x + * N, y);
}
}
} printf("%d\n", ans);
} int main()
{
cin >> N >> K; for (int i = ; i < K; i++) {
cin >> T[i] >> X[i] >> Y[i];
} solve();
return ;
}

最新文章

  1. API23时权限不被许可
  2. 第一天 Linux 是什么
  3. Android 调用浏览器和嵌入网页
  4. noip知识点总结之--贪心
  5. Revit 二次开发 沿弧形路径创建拉伸屋顶
  6. java Timer 使用小结
  7. A Game of Thrones(17) - Bran
  8. ASP.NET自定义控件组件开发 第一章 待续
  9. C#框架
  10. Alfred工具
  11. vue数组语法兼容问题
  12. ffmpeg奇数分辨率转码失败
  13. P3383 【模板】线性筛素数
  14. MySQL系列详解二:MySQL语句操作-技术流ken
  15. dp 洛谷P1977 出租车拼车 线性dp
  16. 关于CaciiEZ端口流量阀值报警的设置
  17. 3分钟上手log4net
  18. dijksta 模板
  19. Docker应用之镜像
  20. json&amp;pickle

热门文章

  1. druid链接数据库
  2. JS 算数
  3. V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1)
  4. 26.异常检测---孤立森林 | one-class SVM
  5. Mysql安装及常用命令
  6. 剑指Offer-37.二叉树的深度(C++/Java)
  7. 源生JS实现点击复制功能
  8. Python调用Redis
  9. apt-get原理
  10. windows 下安装beego