poj1182食物链(种类并查集)
http://poj.org/problem?id=1182
r[x] = 0 表示x和父亲是同类
r[x] = 1 表示x吃父亲
r[x] = 2 表示x被父亲吃
因为只存在三种动物,且三种动物构成了环形
所以动物之间的关系是可推导的。
如图:
c与a的关系为(r[b] + r[c])%3; b与父亲a的关系可为0,1,2 c与父亲b的关系为0,1,2 。每种取值时,自己在纸上推导一下,就能得到这个关系。
路径压缩的时候就要用到这个关系来修改r[c],
如何判断 D a b 是不是假话呢? 当fa == fb 时。说明动物a和b都在一个集合里。那么可以推导它们之间的关系

我们已知两条黑线,我们要求得是红线2,即a与b的关系。 如果知道红线1,那么推导a和b的关系,那么就和上面那个图一样
红线1 = (3 - r[b])%3; 这个枚举一下r[b]的取值,然后推一下就知道了
所以如果 (r[a] + 3-r[b])%3==d-1 那么就是真话
如果fa!=fb。 那么就要合并两个集合
。道理和上面一样,先求红线1,然后求红线2,继而求出红线3.然后合并两个集合
#include <stdio.h>
int father[],r[]; void init(int n)
{
for(int i=; i<=n; ++i)
{
father[i] = i;
r[i] = ;
}
} int find(int x)
{
if(x==father[x]) return father[x];
int t = find(father[x]);
r[x] = (r[father[x]] + r[x])%;
father[x] = t;
return father[x];
/*
路径压缩时关系的推导,r[father[x]] 是father[x]和根结点的关系,r[x]是x和father[x]的关系
*/
}
int main()
{
int n,k,i,d,x,y,ans,fx,fy;
scanf("%d%d",&n,&k);
{
ans = ;
init(n);
for(i=; i<k; ++i)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n || y>n ||(d== && x==y)) ans++;
else
{
fx = find(x);
fy = find(y);
if(fx==fy)
{
if((r[x]+-r[y])%!=d-) ans++;
}
else
{
father[fx] = fy;
//r[fy] = (r[x]-r[y]+d-1+3)%3;
r[fx] = (d-+r[y]-r[x])%;
}
}
}
printf("%d\n",ans);
}
return ;
}
poj1182食物链(种类并查集)的更多相关文章
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- POJ1182 食物链 —— 种类并查集
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- poj1182(种类并查集好题)
不得不说,我得感谢@驱动幽灵百鬼夜行小肆,正是因为看明白了他给出的解析,我才完全弄懂种类并查集的,这里,我也不想去改其他的,就直接引用他的解题报告吧 转载:http://blog.csdn.net/c ...
- POJ1182 食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 55260 Accepted: 16210 Description ...
- POJ1182食物链(并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ-1182 食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 75814 Accepted: 22528 Description ...
- poj1182 食物链【并查集-好题!】
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两 ...
- POJ1182食物链 (并查集)
第一反应就是和那个搞基的虫子的题很像(poj2492 http://www.cnblogs.com/wenruo/p/4658874.html),不过是把种类从2变成了3. 错在很白痴的地方,卡了好久 ...
- poj1182 食物链(并查集 好题)
https://vjudge.net/problem/POJ-1182 并查集经典题 对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类). 把两个元素放在一个组代表 ...
- P2024 [NOI2001]食物链(种类并查集)
题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...
随机推荐
- ThinkPHP 3 的CURD管理用户信息 修改和删除
本节课大纲: 一.ThinkPHP 3 的CURD管理用户信息 http://localhost:8080/thinkphp/index.php/User/index 访问User类的index方法 ...
- Redis intset
Redis intset也非常简单.它是一个有序整数集合,实际上是一个有序数组,查找时二分查找,添加时可能需要内存挪动.唯一不同的是,它的整数类型是变动的,可以支持int16,int32,int64三 ...
- HttpWeb服务器之--用OO方式写
虽然写的不是很好,但 最终解释权以及版权归13东倍所有! package com.web; import java.io.IOException; public class Test { public ...
- 【iOS】iOS的iTunes文件共享,在程序Document路径
有时候程序开发须要通过沙盒中的 documents目录与用户共享文件,iTunes默认是不支持iTunes file Sharing的,首先设置 info-list的Application suppo ...
- EditTex属性
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool ...
- mooon编译系统介绍(可复用Makefile)
mooon编译系统介绍(可复用Makefile).pdf(ChinaUnix下载) CSDN下载:http://download.csdn.net/detail/aquester/5626929 mo ...
- java学习笔记04--数组
java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...
- IOS中的id与nil
1 id id和void *并非完全一样.在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject) ...
- 基于DSP的疲劳驾驶检测系统的研究
原地址:http://www.chinaaet.com/article/index.aspx?id=114534 关键词:疲劳检测DSP亮瞳效应PERCLOS 摘 要: 针对汽车驾驶员疲劳驾驶检测的 ...
- syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区
syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区 syslog-ng 3.4.3 发布,强烈建议升级 oschina 发布于: 2013年08月16日 (2评) 分享到 ...