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 ...
随机推荐
- .NET面试题解析(9)-SQL语言基础及数据库基本原理
见面试题 1. 索引的作用?她的优点缺点是什么? 2. 介绍存储过程基本概念和 她的优缺点? 3. 使用索引有哪些需要注意的地方? 4. 索引碎片是如何产生的?有什么危害?又该如何处理? 5. 锁的目 ...
- Class文件结构-属性表
一.属性表整体结构 二.属性表具体结构
- C lang:character input and output (I/O)
Xx_Introduction Character input and output is by more line character conpose of the text flow Defin ...
- idea开发时springboot项目时的自动编译和热部署
前提:最好将idea的启动器设置一下 操作:1.file > Build,Execution,Deployment > Compiler 勾选 Build project automati ...
- 电池中的NTC功能是什么?【转】
电池的NTC功能是什么 因为可充电电池在不断的循环充电和放电过程中可能会导致电池温度的过高,导致电池原始性能下降.为了保持电池性能,密切监测电池温度非常重要,NTC在充电电池组内部的合适应用中可以起到 ...
- Python语法速查: 7. 函数基础
返回目录 (1)函数基本 ● 函数是第一类对象 Python中万物皆对象,所有对象都是第一类的(first class),函数也不例外,也是第一类对象.既然是对象,那就可以当作普通的对象数据处理,比如 ...
- [Go] golang定时器与redis结合
golang定时器与redis结合,每隔1秒ping一下,每隔20秒llen一下队列的长度 package main import ( "fmt" "time" ...
- VM虚拟机安装无法将值写入注册表.....请确认你是否有足够的权限访问该注册表项,或者与技术支持人员联系。
解决方法: 关掉360安全卫士等软件再安装
- JavaScript-----9.函数
1.函数的使用 1.1 声明函数和调用函数 //1.声明函数 //function 函数名() { // //函数体 //} function sayHi() { console.log('hi~') ...
- SqlException:ConnectionTimeout Expired. The timeout period elapsed during the post-login phase
linux系统部署.netcore程序后,访问某台sqlserver 2008 R2数据库 Connection Timeout Expired. The timeout period elapsed ...