POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典
题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/
题意:给出动物之间的关系,有几种询问方式,问是真话还是假话。
定义三种偏移关系:
x->y 偏移量0时 x和y同类
x->y 偏移量1时 x被y吃
x->y 偏移量2时 x吃y
定义 rela[x]=rx->x;
如x,y不在同一个集合中,
由rx->ry=rx->x + x->y + y->ry=(rx->x)+(x->y)-(ry->y)可得
rx->ry=rela[ry]=rela[x]+rela[y]+(x->y);
由于关系仅限0,1,2,三种,对上面关系加三后取模才是正确的关系;
如果x,y在同一个集合中,
x->y=x->rx+rx->x;
所以x->y=(3-rela[x]+rela[y])%3;
种类并查集的问题我们必须清楚初始状况是什么样的还有状态的转移方程是什么。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 50005
int n,k;
int fa[maxn],rela[maxn];//分别表示父亲、子节点和父节点的关系
int ans;
void init()
{
for(int i=;i<=n;i++)
{
fa[i]=i; /*relation:0、同类 1、吃2、被吃*/
rela[i]=;//初始状态下它和本身在一个集合中,关系为同类
}
ans=;
}
int find(int x)
{
if(x==fa[x])return fa[x];
else
{
int tmp=fa[x];
fa[x]=find(fa[x]); rela[x]=(rela[tmp]+rela[x])%;//更新x与x的新的根结点的关系,ppx->x=ppx->px+px->x=rela[ppx]+real[px];
return fa[x];
} //向量模式,rela为rootx->x的向量方向;为保证结果在[0,2]区间内,对3取模;
}
int main()
{
cin>>n>>k;
init();
int f,a,b;
for(int i=;i<=k;i++)
{
scanf("%d%d%d",&f,&a,&b);
if(a>n||b>n)
{
ans++;
continue;
}
if(f==&&a==b)//x吃x ,不合法,
{
ans++;
continue;
}
int px=find(a);
int py=find(b);
if(px!=py) //如果关系还未建立则建立关系 //合并的操作和查询是否正确的操作在主函数体中一起完成
{
fa[py]=px;
rela[py]=(+rela[a]+(f-)-rela[b])%;
}
else
{
if(f==&&rela[a]!=rela[b])//说是同类然而 计算得并不是,则说了假话
{
ans++;
continue;
}
if(f==&&(+rela[b]-rela[a])%!=f-)//两者之间三种状态题目中只有两种描述方式
{
ans++;
continue;
}
} } cout<<ans;
}
下面是分集合操作的代码,集合划分成三个 i是同类集合,n+i是食物集合,2*n+i表示天敌集合,三个集合是绝对不相交的。
代码如下:(因为只有吃,被吃,吃三种状态,所以检测的时候可能错误的状态就是两种)
#include<cstdio>
#include<iostream>
using namespace std;
int fa[];
int x1,x2,x3,y1,y2,y3;
int n,k,d,x,y,ans=;
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n*;i++) fa[i]=i;
for(int i=;i<=k;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n)
{
ans++;
continue;
}
x1=find(x); //x表示自己
x2=find(x+n); //x+n表示x的食物
x3=find(x+n*); //x+2*n表示x的天敌
y1=find(y); //y表示自己
y2=find(y+n); //y+n表示y的食物
y3=find(y+n*); //y+2*n表Y的是天敌
if(d==)
{
if(x1==y2||y1==x2) ans++;
//给出的话表明x和y是同类,但是检测发现x吃y或者y吃x,产生矛盾。
//在这次检测之中和x,y的天敌集合是没有关系的,因为天敌只是对一方的天敌
//比如说x的天敌可能是y的同类,也可能是食物,也可能是天敌,所以说,是没有定论的美不需要检测
else
{
fa[x1]=y1;//由于x和y是同类,所以他们的同类,天敌,食物都是一样的,所以需要全部合并
fa[x2]=y2;
fa[x3]=y3;
}
}
else
{
if(x1==y1||x1==y2) ans++;//给出的话中表明x吃y,但是检测发现x和y是同类或者y吃x,发生矛盾
else
{//集合的合并
fa[y1]=x2;//y的同类都是x的食物
fa[y2]=x3;//x吃y,y吃z,z吃x
fa[y3]=x1;//将x集合归入y的天敌集合
}
}
}
printf("%d",ans);
return ;
}
POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典的更多相关文章
- poj 1182 食物链(种类并查集 ‘初心者’)
题目链接:http://poj.org/problem?id=1182 借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的. 题意就不解释了,中问题. 关于种类并查集结局方法也是挺多的 1扩增 ...
- Poj(1703),种类并查集
题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- poj 1182 食物链 (带关系的并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...
- POJ1703 Find them Catch them 关于分集合操作的正确性证明 种类并查集
题目链接:http://poj.org/problem?id=1703 这道题和食物链那道题有异曲同工之处,都是要处理不同集合之间的关系,而并查集的功能是维护相同集合之间的关系.这道题中有两个不同的集 ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- Poj(1182),种类并查集
题目链接:http://poj.org/problem?id=1182 再次熟练种类并查集,又积累点经验,和技巧,rank 0 2 1 先计算father[x] ,再更新rank[x]; #inclu ...
- 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)
传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...
随机推荐
- linux增加history时间戳
增加环境变量到/etc/profile export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " export HISTSIZE=9999
- 当学术邂逅浪漫 – 记MobiCom 2015大会
作者:微软亚洲研究院主管研究员 刘云新 今年的MobiCom大会在著名的浪漫之都巴黎举行.通常于欧洲举办的会议的参会人数会相对少一些,但今年的MobiCom大会吸引了近400人参加,绝不少于往年.浪漫 ...
- iOS常用框架源码分析
SDWebImage NSCache 类似可变字典,线程安全,使用可变字典自定义实现缓存时需要考虑加锁和释放锁 在内存不足时NSCache会自动释放存储的对象,不需要手动干预 NSCache的key不 ...
- 代码演示C#各版本新功能
代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...
- 如何通过学校系统漏洞注册到 @edu.cn 邮箱账号?
此文章仅针对我自己学校的系统进行分析,并不代表所有学校的系统都是如此. 我们学校比较"抠",可能是为了节省学校的带宽资源然后禁止学生注册教育邮箱账号.不过像一部电影所说的那样&qu ...
- 探究 Go 语言 defer 语句的三种机制
Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer ...
- VUE实现Studio管理后台(二):Slot实现选项卡tab切换效果,可自由填装内容
作为RXEditor的主界面,Studio UI要使用大量的选项卡TAB切换,我梦想的TAB切换是可以自由填充内容的.可惜自己不会实现,只好在网上搜索一下,就跟现在你做的一样,看看有没有好事者实现了类 ...
- 从头认识js-HTML中使用JavaScript
<script>元素 在HTML页面中插入Javascript的主要办法就是使用<script>元素,HTML4.01为<script>定义了下列6个属性. 1.a ...
- c/s用户与服务器之间的传输
####第一页 <%@ page language="java" contentType="text/html; charset=UTF-8" pageE ...
- Web网页布局的主要方式
一.静态布局(static layout) 即传统Web设计,网页上的所有元素的尺寸一律使用px作为单位. 1.布局特点 不管浏览器尺寸具体是多少,网页布局始终按照最初写代码时的布局来显示.常规的pc ...