POJ 1182 食物链 (三态种类并查集)
这题首先不说怎么做,首先要提醒的是。。:一定不要做成多组输入,,我WA了一个晚上加上午,,反正我是尝到苦头了,,请诸君千万莫走这条弯路。。切记
这题是上一题(Find them and Catch them)的难度更高的版本,如果你没做的话建议先做那个,用并查集来解,分成三种状态,因为要查询关系,直接查无法查,于是以根节点作为中继点,每个节点做一个标记表示与根节点的关系,0表示与根同类,1表示吃根,2表示被根吃,也必须是这三个数,不能使-1,1,0或别的什么的,因为那样无法转化。
在findset时要记得根据该节点与其父节点的关系和父节点与爷爷节点的关系来推出该节点与他的爷爷节点的关系,做到实时更新(因为合并会使他的标记变化)。
然后合并: 标记: ca[x];
在findset时要记得根据该节点与其父节点的关系和父节点与爷爷节点的关系来推出该节点与他的爷爷节点的关系,做到实时更新(因为合并会使他的标记变化)。 然后合并:
标记: ca[x]; .如果断言为a和b同类
{
.如果在同一集合,判断ca[a]是否等于ca[b]
.不在同一集合则合并,此时
ca[x] = (-ca[a] + ca[b] + )%; //加3是为了防止负数
因为图示:
}
.如果断言为a吃b
{
.如果在一个集合,判断是否有a吃b的关系
if((ca[a] + )% =?= ca[b])..
怎么来的自己可以推导一下
.如果不在,合并
ca[x] = (-ca[a] + + ca[b] + )%; //加3是为了防止负数
}
图示:
下面上代码:
#include <iostream>
#include <cstdio>
using namespace std;
#define N 50100
int fa[N],ca[N]; void makeset(int n)
{
for(int i=;i<=n;i++)
{
fa[i] = i;
ca[i] = ; // 0:同类 1:吃 2:被吃
}
} int findset(int x)
{
if(x != fa[x])
{
int tmp = fa[x];
fa[x] = findset(fa[x]);
ca[x] = (ca[x] + ca[tmp])%;
}
return fa[x];
} int unionset(int op,int a,int b)
{
int x = findset(a);
int y = findset(b);
if(op == ) //a与b是同类关系
{
if(x == y) //如果已经在一个集合里面了,则判断这句话的真假即可
{
if(ca[a] == ca[b])
{
return ; //假话增量为0,说明是真话
}
else
return ; //假话增量为1,说明是假话
}
else //还不在一个集合中,合并两个集合
{
fa[x] = y;
ca[x] = (-ca[a] + ca[b] + )%;
}
}
else //op = 2 ,a吃b的关系
{
if(x == y) //在一个集合中,判断是否正确
{
if((ca[a] + )% == ca[b]) //这样才能形成 a吃b吃gen吃a 即形成a 吃 b 的关系
{
return ; //假话增量为0
}
else
return ;
}
else //不在一个集合中,合并
{
fa[x] = y;
ca[x] = (-ca[a] + + ca[b])%;
}
}
return ; //不处理的返回值
} int main()
{
int n,k,cnt,i;
int op,a,b;
scanf("%d%d",&n,&k);
cnt = ;
makeset(n);
for(i=;i<k;i++)
{
scanf("%d%d%d",&op,&a,&b);
if(a > n || b > n)
cnt++;
else if(op == && a == b)
cnt++;
else
cnt += unionset(op,a,b);
}
cout<<cnt<<endl;
return ;
}
还可以参考:
http://blog.csdn.net/shuangde800/article/details/7974668
http://blog.csdn.net/freezhanacmore/article/details/8767413
POJ 1182 食物链 (三态种类并查集)的更多相关文章
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- poj 1182 食物链(种类并查集 ‘初心者’)
题目链接:http://poj.org/problem?id=1182 借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的. 题意就不解释了,中问题. 关于种类并查集结局方法也是挺多的 1扩增 ...
- POJ 1182 食物链(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63592 Accepted: 18670 Description ...
- POJ 1182 食物链 (种类并查集)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说 ...
- POJ 1182——食物链——————【种类并查集】
食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status P ...
- poj 1182 食物链(关系并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62824 Accepted: 18432 Description ...
- POJ 1182 食物链(经典并查集) (多组输入有时乱加也会错!)
多组输入有时乱加也会错! 这次用多组输入竟然,不用竟然对了,所以以后做题目,若是答案错误,先看加上或者删掉多组输入,看对不对 食物链 Time Limit: 1000MS Memory Lim ...
- poj 1182 食物链 带权并查集
食物链是并查集的进阶运用的一道非常经典的题目. 题目如下: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A, ...
- POJ 1182 食物链 (带权并查集 && 向量偏移)
题意 : 中文题就不说题意了…… 分析 : 通过普通并查集的整理归类, 能够单纯地知道某些元素是否在同一个集合内.但是题目不仅只有种类之分, 还有种类之间的关系, 即同类以及吃与被吃, 而且重点是题目 ...
- POJ1182 食物链---(经典种类并查集)
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
随机推荐
- T-SQL的回车和换行符(SQL)
T-SQL的回车和换行符(SQL) sql server中的回车换行字符是 char(13)+char(10) 回车:char(13) 换行:char(10) 实例1: DECLARE @c NVA ...
- mybatis3批量更新 批量插入
在公司ERP项目开发中,遇到批量数据插入或者更新,因为每次连接数据库比较耗时,所以决定改为批量操作,提升效率.库存盘点导入时,需要大量数据批量操作. 1:数据库连接代码中必须开启批量操作.加上这句,& ...
- 解决客户 IE 浏览器"兼容性视图"设置带来的问题
最近在给客户开发一个 ASP.NET web 报表时,发现客户的 IE8 浏览器上,看网页总是怪怪的. 调查后发现,客户的 IE8 浏览器,统一被设置成"对本地网络使用兼容性视图" ...
- nodeJS中npm常见的命令
常用的nodeJS中npm的命令:npm主要是node包管理和发布的工具.npm常用的命令:1:npm install <name> //(下载包) 下载后的包放在当前路径下面 npm i ...
- React对话框组件实现
当下前端届最火的技术之一莫过于React + Redux + webpack的技术结合.最近公司内部也正在转react,这周主要做了个React的modal组件,接下来谈下具体实现过程. 基本的HTM ...
- while循环语句的使用
说明:先判断表达式,后执行语句,while循环称为当型循环. 如果指定的条件为真(表达式为非0)时,执行while语句中的内嵌语句. 格式:while (表达式) //判断括号内表达式 真(tru ...
- R语言学习笔记:分析学生的考试成绩
孩子上初中时拿到过全年级一次考试所有科目的考试成绩表,正好可以用于R语言的统计分析学习.为了不泄漏孩子的姓名,就用学号代替了,感兴趣可以下载测试数据进行练习. num class chn math e ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q51-Q53)
Question 51You use a third-party site definition to create SharePoint sites.You need to add a Web Pa ...
- C语言接口与实现实例
一个模块有两部分组成:接口和实现.接口指明模块要做什么,它声明了使用该模块的代码可用的标识符.类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实 ...
- linux终端python自动提示
linux终端python自动提示 很多时候,在linux下编写python时, 都懒得去vi一个新文件,直接就新开一个终端, 进入python命令行模式,然后就可以写一些测试代码. 不过最悲剧的就是 ...