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食物链(种类并查集)的更多相关文章

  1. NOI2001|POJ1182食物链[种类并查集 向量]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65430   Accepted: 19283 Description ...

  2. POJ1182 食物链 —— 种类并查集

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  3. poj1182(种类并查集好题)

    不得不说,我得感谢@驱动幽灵百鬼夜行小肆,正是因为看明白了他给出的解析,我才完全弄懂种类并查集的,这里,我也不想去改其他的,就直接引用他的解题报告吧 转载:http://blog.csdn.net/c ...

  4. POJ1182 食物链(并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 55260   Accepted: 16210 Description ...

  5. POJ1182食物链(并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  6. POJ-1182 食物链(并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 75814   Accepted: 22528 Description ...

  7. poj1182 食物链【并查集-好题!】

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两 ...

  8. POJ1182食物链 (并查集)

    第一反应就是和那个搞基的虫子的题很像(poj2492 http://www.cnblogs.com/wenruo/p/4658874.html),不过是把种类从2变成了3. 错在很白痴的地方,卡了好久 ...

  9. poj1182 食物链(并查集 好题)

    https://vjudge.net/problem/POJ-1182 并查集经典题 对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类). 把两个元素放在一个组代表 ...

  10. P2024 [NOI2001]食物链(种类并查集)

    题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...

随机推荐

  1. Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net

    原文:Lucene.Net 2.3.1开发介绍 -- 一.接触Lucene.Net 1.引用Lucene.Net类库找到Lucene.Net的源代码,在“C#\src\Lucene.Net”目录.打开 ...

  2. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  3. 在cocos2d-x jsb/html5中设置触摸代理的方法

    和官方的说明不同,js binding的很多api和ch5版是不一样的.遇到不一样的就需要我们努力去看源码寻找了. 主要是以下几个文件 cocos2d_specifics.cpp cocos2d_sp ...

  4. Cocos2dx-Android 之Makefile通用高级写法

    不废话,直接贴.节约时间.须要改进的地方请各位指出.共同学习. LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := c ...

  5. Swift - 类和结构体的区别

    类和结构体有许多相同之处,也有许多不同之处. 二者区别如下: 1,类可以继承和扩展,结构体不可以 2,可以让一个类的实例来反初始化,释放存储空间,结构体做不到 3,类的对象是引用类型,而结构体是值类型 ...

  6. python 时间戳 datetime string 转换

    import datetime import time **datetime转时间戳** In [1]: now = datetime.datetime.now() In [2]: time.mkti ...

  7. 忽然想到:把Mu的源代码一网打尽

    那么那些流媒体开发的公司,就不会拒绝我了,真是一举两得.

  8. QT实现不规则窗体

    看到网上有很多不规则窗体的实现,效果很酷.于是使用QT也实现了一个,QT的不规则窗体实现非常简单,只需要设置一个mask(遮掩)图片,这个图片的格式可以使用png或bmp格式,我使用了png格式,默认 ...

  9. TCP连接的建立(二)

    被动打开 SYN cookies TCP协议开辟了一个比較大的内存空间请求连接队列来存储连接请求块,当SYN请求不断添加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求.SYN cookies技 ...

  10. hdu1116--解题报告--初步了解欧拉回路

    由题目意思..我们只要把n个字符串的首尾字母看作是点,这个字符串看着边来处理就可以啦...将题目的案例图形化如下: 那么接着就是欧拉路径和欧拉回路判断,我们这里用并査集来判断图是不是连通的,然后根据有 ...