POJ 1182 食物链 【并查集】

来源:互联网 发布:男神执事团类似网络剧 编辑:程序博客网 时间:2024/06/08 06:08

食物链
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 69466 Accepted: 20539

Description

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 
有人用两种说法对这N个动物所构成的食物链关系进行描述: 
第一种说法是"1 X Y",表示X和Y是同类。 
第二种说法是"2 X Y",表示X吃Y。 
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 
1) 当前的话与前面的某些真的话冲突,就是假话; 
2) 当前的话中X或Y比N大,就是假话; 
3) 当前的话表示X吃X,就是假话。 
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。 

Input

第一行是两个整数N和K,以一个空格分隔。 
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。 
若D=1,则表示X和Y是同类。 
若D=2,则表示X吃Y。

Output

只有一个整数,表示假话的数目。

Sample Input

100 71 101 1 2 1 22 2 3 2 3 3 1 1 3 2 3 1 1 5 5

Sample Output

3

思路:首先去除那些很明显是假话的话,就是X和Y不符合题目范围的。其他的话要通过并查集维护。

对于每只动物i创建i属于A类,i属于B类,i属于C类,并用这3*N个元素建立并查集。

用元素x、x+n、x+2*n分别代表x属于A,x属于B,x属于C。

并查集里每个组的表示组内所有元素代表的情况都同时发生或不发生。

例如,i属于A和j属于B在同一个组里,就表示如果i属于种类A那么j一定属于种类B,如果j属于种类B那么i一定属于种类A。

对于1,2两种情况。

1:x和y属于同一类,何合并x属于A和y属于A、x属于B和y属于B、x属于B和y属于B。

2:x吃y,合并x属于A和y属于B、x属于B和y属于C、x属于C和y属于A。

代码如下:

#include<cstdio>#include<iostream>#define N 50005using namespace std;int parent[N * 3];//并查集 void init(){//初始化并查集 for(int i = 0; i < N * 3; i++){parent[i] = i;}}int find(int x){//寻找根节点 if(parent[x] == x){return x;}else{return parent[x] = find(parent[x]);}}void unite(int x, int y){//合并 x = find(x);y = find(y);if(x == y) return ;else parent[x] = y;}bool same(int x, int y){//判断是否同属一个并查集 return find(x) == find(y);}int main(){int n, k, d, x, y, i, cnt;scanf("%d%d", &n ,&k); cnt = 0;init();for(i = 0; i < k; i++){scanf("%d%d%d",&d ,&x, &y);if(x > n || y > n || x <= 0 || y <= 0){cnt++;continue; }if(d == 1){if(same(x, y + n) || same(x, y + 2 * n)){//x、y分别属于A、B或A、C,即不同类 cnt++;}else{//三种情况,x,y都属于A,都属于B,或者都属于C unite(x, y); unite(x + n, y + n);unite(x + 2 * n, y + 2 * n);}}else{if(same(x, y) || same(x, y + 2 * n)){//x、y都属于A或分别属于A、C,即不会吃 cnt++;}else{//三种情况,x,y分别属于A、B,B、C,或C、A unite(x, y + n);unite(x + n, y + 2 * n);unite(x + 2 * n, y);}}}cout<<cnt<<endl;return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上班穿皮鞋脚疼怎么办 高跟靴子买大了怎么办 我怀了第三个小孩怎么办? 离婚前把钱花了怎么办 对谈对象有压力怎么办 和对象感情淡了怎么办 孩子处对象学习下降怎么办 孩子高三成绩差怎么办 老妈怨气太重怎么办 广东小高考有d怎么办 高考考生档案袋有个小洞怎么办 江苏省考生出省后小高考成绩怎么办 江苏小高考三D怎么办 小高考补考没过怎么办 理科高考200多分怎么办 高考没考过200分怎么办 电子手表指针不走了怎么办 家长说你教的不好怎么办 小升初分班考试考砸了怎么办 老公不给老婆看病怎么办 孕妈妈涨奶严重怎么办 90岁老头尿不下尿怎么办 妻子要离婚丈夫不离怎么办 弟媳妇天天在家吵架怎么办 弟媳妇不和我说话怎么办 我想和弟媳妇做一次怎么办 老公对弟媳妇有非分之想怎么办 跟弟媳妇有矛盾怎么办 学生考试前不认真怎么办 有人雇凶要杀我怎么办 高考理综数学英语都没考好怎么办 母亲判刑孩子未成年无人监管怎么办 高三了数学30分怎么办 母猪发烧耳朵放血止不住了怎么办? 青春期孩子动手打父母该怎么办 20岁睡觉不老实怎么办 孕妇梦见钱掉了怎么办 小孩晚上睡觉鼻子塞怎么办 宝宝晚上睡觉鼻子塞怎么办 按摩后吹冷气发冷怎么办 碰到特别细心敏感的下属怎么办