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 ...
随机推荐
- PHP程序z中xdebug工具简要使用方法
PHP程序的debug PHP程序的debug,无论是cli方式还是web方式,都需要使用第三方的debug工具.PHP5.6之前,本身自带的debug功能,仅限于日志输出. 推荐使用免费xdebug ...
- Android应用开发基础之九:内容提供者(ContentProvider)
内容提供者 应用的数据库是不允许其他应用访问的 内容提供者的作用:就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代 ...
- java分派
变量被声明时的类型叫做变量的静态类型(Static Type) 又叫明显类型(Apparent Type).变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type). 根据对象的类型而 ...
- TeamCity配置笔记
1.编译sln 2.发布网站 3.重复代码检测 4.代码分析 5.单元测试&覆盖率测试 查看代码覆盖率 7.代码签入时自动触发编译 8.通知 1.在teamcity安装目录中找到TrayNot ...
- Cache&Session Viewer
用于查看和删除网站Cache https://github.com/sdf333/Aspy
- RHEL7用户管理
本文介绍Linux的用户管理 用户管理 Linux 是一个可以实现多用户登陆的操作系统,不同用户可以同时登陆同一台主机,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件. 但实 ...
- 在ALV中更新数据库表
FORM usercommand USING ucomm TYPE sy-ucomm selfield TYPE slis_selfield. DATA: lr_grid TYPE REF TO cl ...
- [ javascript canvas toDataURL() clip() ] javascript canvas toDataURL() clip() 属性及方法演示
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- ListView属性整理
stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false android:stackFromBottom="true" 第 ...
- Swift控制流
本文简单的介绍swift一些基本语法的使用,在本文中不会做更深的剖析,只提及一些语法的简单的使用,快速学会编写swift程序.高手请绕路走嘿嘿 常量与变量: swift中定义所有的变量使用var,定义 ...