POJ 1182 食物链(带权并查集)

http://poj.org/problem?id=1182

题意:

动物王国中有三类动物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),输出假话的总数。

思路:

这不是普通的并查集,因为每个元素之间有3种关系,所以这就是所谓的带权并查集。

因为只有3类动物,也就是如果我们知道了A吃B,B吃C,那么我们也就知道了C吃A,这点很重要。

我们用rank数组来标记当前结点和它的祖先结点之间的关系,rank[]=0表示同类,rank[]=1表示吃,rank[]=2表示被吃。

如果对下面代码有不理解的,可以用案例来画个图,这样就很容易理解了。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9
10 const int maxn=50000+5;
11
12 int n,k;
13 int d,x,y;
14 int p[maxn];
15 int rank[maxn];
16
17 int find(int x)
18 {
19     if(x==p[x])  return p[x];
20     int y=find(p[x]);
21     rank[x]=(rank[x]+rank[p[x]])%3;   //压缩路径时需要改变该结点与祖先节点之前的rank值
22     return p[x]=y;
23 }
24
25 int Union(int d,int x,int y)
26 {
27     int fx=find(x);
28     int fy=find(y);
29
30     if(fx==fy)
31     {
32         //在祖先结点相同的情况下是否和之前的情况有矛盾
33         if((rank[x]-rank[y]+3)%3==d-1)    return 0;
34         return 1;
35     }
36     else
37     {
38         p[fx]=fy;
39         rank[fx]=(rank[y]-rank[x]+d-1+3)%3;
40         return 0;
41     }
42 }
43
44 int main()
45 {
46     //freopen("D:\\input.txt","r",stdin);
47     scanf("%d%d",&n,&k);
48     for(int i=0;i<=n;i++)  {p[i]=i;rank[i]=0;}
49
50     int ans=0;
51     while(k--)
52     {
53         scanf("%d%d%d",&d,&x,&y);
54         if(x>n || y>n)         ans++;
55         else if(d==2 && x==y)  ans++;
56         else ans+=Union(d,x,y);
57     }
58     printf("%d\n",ans);
59     return 0;
60 }
时间: 2024-10-24 07:13:57

POJ 1182 食物链(带权并查集)的相关文章

POJ 1182 食物链 带权并查集

动物王国中有三类动物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句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假话,否

POJ 1182 食物链 (带权并查集 &amp;&amp; 向量偏移)

题意 : 中文题, 直接去POJ  1182看即可 分析 : 通过普通并查集的整理归类, 能够单纯地知道某些元素是否在同一个集合内.但是题目不仅只有种类之分, 还有种类之间的关系, 即同类以及吃与被吃, 而且重点是题目问的并不是种类是否在一个集合内, 而是考察给出的关系是否矛盾.在解释之前, 先明白一个问题, 对于给出的关系, 如果我不能通过前面的信息来推断出来, 是不是不能够判断现在给出关系的对错?那就将这个信息作为真命题并存储起来, 方便后面判断.有了刚刚前面的陈述, 可以知道两个东西=>

A Bug&#39;s Life POJ - 2492 (带权并查集)

A Bug's Life POJ - 2492 Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, indi

poj 1182食物链【种类并查集】

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49310   Accepted: 14382 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同

poj 1182 食物链(种类并查集 ‘初心者’)

题目链接:http://poj.org/problem?id=1182 借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的. 题意就不解释了,中问题. 关于种类并查集结局方法也是挺多的 1扩增倍数. 就是有几种关系就建立几倍数组,具体方法在这里不详细说了,这种方法有弊端 比较复杂而且内存消耗比较大如果关系比较多就容易爆掉. 2向量的方法. 这种方法要详细解说一下.这个方法好处都有啥.......(自行脑补后面的话) 这个方法的优点占用内存比较小而且比较简洁.只要找到关系就行. 下面就用方

POJ 1182 食物链 (种类并查集)

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47729   Accepted: 13895 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同

POJ 1182——食物链——————【种类并查集】

食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一

poj 1703(带权并查集)

Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31840   Accepted: 9807 Description The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon

ACWing 240. 食物链 带权并查集

题目: 动物王国中有三类动物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

POJ - 1182 食物链(种类并查集)

题目链接:http://poj.org/problem?id=1182 题意:三种关系,A吃B, B吃C,C吃A.给出k个句话,如果那句话和前面冲突即为假话 求假话出现的总数. 以前周赛考过一次,感觉好难,就溜了.(逃... 今天看<挑战...>看到有这道题目,感觉是时候来一发了... 因为有三种关系,扩增数组为3*N,每N个分别代表A 种类,B种类,C种类. 题目要求当D=1时,x和y为同类:D=2时,x吃y //默认x为A物种,然后当D=1时,说明y不可能是B和C物种,也就是说他们的爸爸不