poj1182 食物链(并查集 好题)

https://vjudge.net/problem/POJ-1182

并查集经典题

对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类)。

把两个元素放在一个组代表他们同时发生。

被不合法数据卡了几次。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<stack>
 8 #define lson l, m, rt<<1
 9 #define rson m+1, r, rt<<1|1
10 #define IO ios::sync_with_stdio(false);cin.tie(0);
11 #define INF 0x3f3f3f3f
12 typedef unsigned long long ll;
13 using namespace std;
14 const int N = 50000;
15 int n, k, d, x, y, ans=0;
16 int pre[50010*3];
17 int find(int x)
18 {
19     while(x != pre[x]){
20         x = pre[x];
21     }
22     return x;
23 }
24 int is_same(int a, int b)
25 {
26     int tx = find(a);
27     pre[a] = tx;
28     int ty = find(b);
29     pre[b] = ty;
30     if(tx == ty) return 1;
31     else return 0;
32 }
33 void join(int a, int b)
34 {
35     int tx = find(a);
36     int ty = find(b);
37     pre[tx] = ty;
38 }
39 void solve()
40 {
41     if(d == 1){//x和y等价
42         if(x > n||x<=0||y > n||y<=0){//不合法
43             ans++;
44             return ;
45         }
46         else if(is_same(x, y+N)||is_same(x, y+2*N))//冲突情况,B吃A,C吃A
47             ans++;
48         else{
49             join(x, y);
50             join(x+N, y+N);
51             join(x+2*N, y+2*N);
52         }
53     }
54     else if(d == 2){//x吃y
55         if(x > n||x<=0||y > n||y<=0){//不合法
56             ans++;
57             return ;
58         }
59         else if(is_same(x, y)||is_same(x, y+2*N)) //冲突情况,A同B,C吃A
60             ans++;
61         else{
62             join(x, y+N);
63             join(x+N, y+2*N);
64             join(x+2*N, y);
65         }
66     }
67 }
68 int main()
69 {
70     for(int i = 0; i <= N*3; i++){
71         pre[i] = i;
72     }
73     scanf("%d%d", &n, &k);
74     for(int i = 0; i < k; i++){
75         scanf("%d%d%d", &d, &x, &y);
76         solve();
77     }
78     printf("%d\n", ans);
79     return 0;
80 }

原文地址:https://www.cnblogs.com/Surprisezang/p/8993215.html

时间: 2024-10-10 17:38:11

poj1182 食物链(并查集 好题)的相关文章

POJ1182 食物链 并查集 好题

食物链 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句话有的是真的,有的是假的.当一句话满足下

POJ1182 食物链 (并查集)*新方法

本文出自:http://blog.csdn.net/svitter 题意: 动物王国中有三类动物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句话,这

poj 1182 食物链 并查集好题

挑战程序设计上有解答的并查集好题.把事件作为元素进行合并,举例:若输入1 2 3,意思就是把2,3归为同一类,至于归于哪一类并不需要去讨论,则把2属于A,3属于A这两件事件归为一类;2属于B,3属于B这两件事归为一类;2属于C,3属于C这两件事归为一类:若输入 2 2 3,由于A吃B,B吃C,C吃A,就把2属于A,3属于B这两件事情归为一类:以此类推.当检测到当前情况与之前正确的情况不符合,则错误的情况数加1. #include <iostream> #include <cstdio&g

POJ1182 食物链 [并查集]

很好的题,分析与题解转自: http://blog.csdn.net/tiantangrenjian/article/details/7085575 http://blog.csdn.net/c0de4fun/article/details/7318642/ 这题不知道为啥写成多组用例不能过,,,oj的一个bug吧~ 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26553   Accepted: 7718 De

poj1182食物链-并查集

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

G - Brain Network (easy)(并查集水题)

G - Brain Network (easy) Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u CodeForces 690C1 Description One particularly well-known fact about zombies is that they move and think terribly slowly. While we still don't know

【HDU1232】畅通工程(并查集基础题)

裸敲并查集,很水一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 #include <string> 1

【HDU1856】More is better(并查集基础题)

裸并查集,但有二坑: 1.需要路径压缩,不写的话会TLE 2.根据题目大意,如果0组男孩合作的话,应该最大的子集元素数目为1.所以res初始化为1即可. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <numeric> 7 #include <

【HDU1325】Is It A Tree?(并查集基础题)

有以下坑点: 1.结束输入不一定-1,题目中的叙述只是说所有权值都为正值. 2.是否构成一棵树不能只判断是否只有一个根节点,没有环路,而且还需要判断每个节点的入度一定是1,不然就不是一棵树. (无环路也可用树的性质:结点数 = 边树 + 1 来取代) 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cctype> 5 #include <cmath&