poj 1182 食物链 并查集 题解《挑战程序设计竞赛》
地址 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 ;
}
poj 1182 食物链 并查集 题解《挑战程序设计竞赛》的更多相关文章
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ 1182 食物链(并查集的使用)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 81915 Accepted: 24462 Description ...
- poj 1182 食物链 并查集的又一个用法
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 41584 Accepted: 12090 Descripti ...
- POJ 1182食物链(并查集)
食物链Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 85474 Accepted: 25549Description动物王国中有三 ...
- POJ - 1182 食物链 并查集经典
思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...
- poj——1182食物链 并查集(提升版)
因为是中文题,题意就不说了,直接说思路: 我们不知道给的说法中的动物属于A B C哪一类,所以我们可以用不同区间的数字表示这几类动物,这并不影响结果,我们可以用并查集把属于一类的动物放在一块,举个例子 ...
- POJ 1182-食物链 [并查集] 《挑战程序设计竞赛》2.4
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ 1182 食物链 (并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50601 Accepted: 14786 Description ...
- POJ 1182 食物链(并查集)
题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...
随机推荐
- WPF炫酷UI及动画
偶然看见了一张图,感觉挺好看的,花了点时间将他转化成了我代码仓库的一部分.虽然不难但也费时间.其中除了背景是百度的一张底图,其他所有内容均通过WPF的Path.Line.TextBlock.Borde ...
- linux下的服务器上传与下载
上传 scp 文件 用户名@服务器ip 服务器保存路径 例如:scp bookmarks_2019_6_24.html root@192.168.0.103:/home 下载 scp 用户名@服务器i ...
- right join 和left join 的区别
SQL 数据库 right join 和left join 的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中 ...
- tensorflow 神经网络模型概览;熟悉Eager 模式;
典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com ...
- linux中的交换分区(swap)及优化
SWAP(交换内存) 1.什么是交换内存? 在硬盘上创建一块区域,当你的物理内存快要被用光的时候,内核临时的 物理内存上的文件数据交换到硬盘上的这段区域上面,当物理内存有闲置的时候 在把交换内存上的数 ...
- Java之Lambda表达式
函数式编程思想概述 面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做. 面向对象的思想: 做一件事情,找一个能解决这个事情的对 ...
- TopCoder12808 「SRM594Medium」FoxAndGo3 二分图最大独立集
问题描述 一个 \(N \times N\) 围棋棋盘,任意两个白子不相邻,你要加入若干个黑子并提出白子,最大化空格数目. submit 题解 显然最终棋盘的局面不能够一个白子和它周围的空格都是空的, ...
- C# LINQ Join两个表连接,关联多个条件的写法
1.sql语句: select * from Users u join Teachers t on u.UserID==t.TeacherID and u.Name=t.Name 2.linq写法: ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值5
CSS综合实例 在Web页面中经常使用栏目显示分类内容.本例将使用HTML和CSS结合编写一个分类栏目模型,用于演示前面介绍的CSS应用.通过使用独立的文件定义样式表,并在HTML文档中使用link标 ...
- SpringMVC参数绑定,这篇就够了!
SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...