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 ...
随机推荐
- Angularjs,WebAPI 搭建一个简易权限管理系统 —— 系统业务与实现(三)
目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 系统业务与实现(二) 上一章我们讲解的 Angu ...
- 将32位MD5摘要串转换为128位二进制字符串
将32为MD5摘要串转换为128位二进制字符串: /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name=& ...
- 自定义View_2_关于自定义组合View
自定义View(2) Android当中给我们提供了丰富的UI控件,当然也许满足不了我们的需求,我们就必须学会自定义自己的View,我们怎么算是自定义自己的view呢! 我们会根据原来有的View对V ...
- mysql存储过程性能监控和分析
公司当前版本的系统大量的使用了存储过程,有些复杂的过程套过程,一个主调用者可能最多调用其它几十个小的业务逻辑和判断,不要说这么做很不合理,在大陆,目前至少30%的证券交易系统代码都是用存储过程写业务逻 ...
- window下从硬盘安装linux系统iso镜像文件的方法
首先,需要安装grub2win,http://sourceforge.net/projects/grub2win/ 其次,将iso文件放在grub2可识别的分区, 如c:\abc\iso.iso 最后 ...
- Ajax基本知识
1.创建xhr对象 var xmlhttp; if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari x ...
- 同源策略 JSONP(实践篇)
JSONP详解 json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. ...
- SharePoint 2013 图像呈现形式介绍
由于图像呈现形式依赖 SharePoint Server 2013 中的其他功能,因此需确保您满足本节中的先决条件,才能执行本文中的过程.先决条件包括: • 发布网站集 您要在其中添加图像呈现形式的网 ...
- iOS中发送HTTP请求的方案
在iOS中,常见的发送HTTP请求的方案有 苹果原生(自带) NSURLConnection:用法简单,最古老最经典的一种方案 NSURLSession:功能比NSURLConnection更加强大, ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...