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 ...
随机推荐
- ahjesus 让Boot Camp支持创建win7 u盘安装盘
通过修改BootCamp助理成功创建USB的windows7的安装盘. 以下将方法共享出来. 准备工作: 找到自己电脑的Boot Rom 版本.(点左上角那个小苹果标志 然后点 [关于本机] 然后点 ...
- sql server 2008空间释放
今天一原来的同事打电话说他们两个表加起来1.2t(每个表都有三四十个字段,6亿条记录),创建了索引之后空间增长到了2.2t,然后没有执行成功.问题在于虽然没执行成功,可是空间没有释放,整个系统只有2. ...
- [Architecture Design] 3-Layer基础架构
[Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...
- docker入门指南(转载)
原文: http://bg.biedalian.com/2014/11/20/docker-start.html 关于 docker 今天云平台的同事提到, 现在的运维就是恶性循环, 因为大家都在申请 ...
- jQuery coveringBad 效果对比
Covering-Bad 是一个可拉动大小的元素,覆盖在原有的元素上面,从而两者进行对比. 在线实例 实例演示1 实例演示2 使用方法 <div class="covered&q ...
- Flexbox实现垂直水平居中
Flexbox(伸缩盒)是CSS3中新增的特性,利用这个属性可以解决页面中的居中问题.只需要3行代码就可以实现,不需要设置元素的尺寸,能够自适应页面. 这个方法只能在现代浏览器上有效,IE10+.ch ...
- angularjs 的ng-bind-html过滤了内容的style
1.不使用ng-bind-html,使用trustAs() trustAsHtml(value) = trustAs($sce.HTML, value) trustAsJs(value) = ...
- JavaScript hasOwnProperty() 函数详解
hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性.如果有,返回true,否则返回false. 该方法属于Object对象,由于所有的对象都"继承 ...
- 程序中条用其他程序中已经存在的PERFORM
PARAMETERS p_sub(40) TYPE c. DATA fssub(40) TYPE c. fssub = p_sub. TRY. PERFORM (fssub) IN PROGR ...
- Office版本问题0x80029C4A
说来奇怪,以前运行正常的程序(涉及excel表格输出),现在运行失败了,一调试,发现了如下问题: 无法将类型为"Microsoft.Office.Interop.Excel.Applicat ...