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物种,也就是说他们的爸爸不可能一样

//当D=1时,说明x吃y,y不可以是A物种(因为捕食关系不可能同类),也不可以是C物种(C吃A)。

看了Gealo学长的博客,发现除了这种扩增法(扩增法因为数组的原因,数据一大很有可能爆内存,不是特别好)还有另外一种向量法,明天起来再补一发。

还有一件事,这个用cin,cout要时间超限。。。并且ios_base::sync_with_stdio(false);在里面完全没有效果。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4
 5 const int N=50000;
 6 int Father[3*N+1];
 7
 8 void init(){
 9     for(int i=1;i<=3*N;i++)
10     Father[i]=i;
11 }
12
13 int find(int x){
14     return x==Father[x] ? x : Father[x]=find(Father[x]);
15 }
16
17 void Union(int x,int y){
18     int fx=find(x),fy=find(y);
19     if(fx!=fy){
20         Father[fx]=fy;
21     }
22 }
23
24 int main(){
25     int ans=0;
26     int n,k,t,x,y;
27     scanf("%d %d",&n,&k);
28     init();
29     for(int i=0;i<k;i++){
30         scanf("%d %d %d",&t,&x,&y);
31         if(x>n||x<1||y>n||y<1) {ans++;continue;}
32         if(t==1){
33             if(find(x)==find(y+n)||find(x)==find(y+2*n)) ans++;
34             else{
35                 Union(x,y);
36                 Union(x+n,y+n);
37                 Union(x+2*n,y+2*n);
38             }
39         }
40         else{
41             if(find(x)==find(y)||find(x)==find(y+2*n)) ans++;
42             else{
43                 Union(x,y+n);
44                 Union(x+2*n,y);
45                 Union(x+n,y+2*n);
46             }
47         }
48     }
49
50     printf("%d\n",ans);
51     return 0;
52 }
时间: 2024-10-26 06:07:31

POJ - 1182 食物链(种类并查集)的相关文章

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)可得

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 食物链【并查集】

题目链接:http://poj.org/problem?id=1182 此题利用并查集解决. 对于每只动物i创建3个元素i-A,i-B,i-C,并用这3*N个元素建立并查集. 1·i-x表示"i属于种类x" 2·并查集你的每一组表示组内所有元素代表的情况同时发生或不发生. 对于每一条信息,只需要按照下列操作即可: 1.第一种:x,y同类,合并x-A和y-A.x-B和y-B.x-C和y-C. 2.第二种:x吃y,,,合并x-A和y-B.x-B和y-C.x-C和y-A. 当然,在合并之前,

poj 1182:食物链(并查集,食物链问题)

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 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 [题目大意] 草原上有三种物种,分别为A,B,C A吃B,B吃C,C吃A. 1 x y表示x和y是同类,2 x y表示x吃y 问给出的信息有几条是和前面相违背的 [题解] 之前这道题是用加权并查集做的,做的有些晕晕乎乎,现在换了种思路做就清晰很多了 将每个点拆点,比如x拆为,x-A,x-B,x-C 表示x属于A类,x属于B类,和x属于C类, 如果y和x属于同类,那么合并x-A和y-A,x-B和y-B,x-C和y-C 如果

POJ 1182 食物链(并查集)

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53651   Accepted: 15730 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://blog.csdn.net/ditian1027/article/details/20804911 http://poj.org/showmessage?message_id=152847 http://blog.163.com/jiazheng2222%40126/blog/static/16963238320101258935104/ 这是discuss里面的一篇分析--- http://poj.org/showmessa

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

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

洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo

题目描述 动物王国中有三类动物 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 带权并查集

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