poj 1182 食物链 并查集 题解《挑战程序设计竞赛》
2024-09-06 09:21:36
地址 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 ;
}
最新文章
- API23时权限不被许可
- 第一天 Linux 是什么
- Android 调用浏览器和嵌入网页
- noip知识点总结之--贪心
- Revit 二次开发 沿弧形路径创建拉伸屋顶
- java Timer 使用小结
- A Game of Thrones(17) - Bran
- ASP.NET自定义控件组件开发 第一章 待续
- C#框架
- Alfred工具
- vue数组语法兼容问题
- ffmpeg奇数分辨率转码失败
- P3383 【模板】线性筛素数
- MySQL系列详解二:MySQL语句操作-技术流ken
- dp 洛谷P1977 出租车拼车 线性dp
- 关于CaciiEZ端口流量阀值报警的设置
- 3分钟上手log4net
- dijksta 模板
- Docker应用之镜像
- json&;pickle
热门文章
- druid链接数据库
- JS 算数
- V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1)
- 26.异常检测---孤立森林 | one-class SVM
- Mysql安装及常用命令
- 剑指Offer-37.二叉树的深度(C++/Java)
- 源生JS实现点击复制功能
- Python调用Redis
- apt-get原理
- windows 下安装beego