洛谷 P2024 食物链(并查集)

2人阅读 评论(0) 收藏 举报
分类:

题目链接: https://www.luogu.org/problemnew/show/P2024

题意:有三种生物A,B,C,它们的关系是A吃B,B吃C,C吃A。现在给出一些语句,判断是否是假话,输出假话数量。

输入类似 a x y,如果a等于1,说明x,y是同类,a等于2说明x是y的天敌。

思路:经典的并查集题目,用x表示生物本身,x+n表示它的猎物,x+2*n表示它的敌人,具
体请看代码注释。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
const int maxn = 5e4+2;//生物数量,分为三类:A,B,C

int N, K, ans = 0;;//K是语句数量,ans是假话数量
int fa[3 * maxn];

int read(){//快读
    int x=0;
    char c = getchar();
    while(c < '0' || c > '9') c = getchar();
    while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
    return x;
}

int find(int x){//并查集查询操作
    if(x == fa[x]) return fa[x];
    return fa[x] = find(fa[x]);
}
int unity(int x, int y){//合并操作
    int a = find(fa[x]),b = find(fa[y]);
    fa[a] = b;
}
int main(){
    N = read(); K = read();
    for(int i = 1; i <= 3 * N; i++)//这里是3*N
        fa[i] = i;//初始化
    for(int i = 1; i <= K; i++){
        int a, x, y;
        a = read(); x = read(); y = read();
        if(x > N || y > N){//不在范围类,当然是假话
            ans++;
            continue;
        }
        if(a == 1){//如果x,y是同类
            if(find(x + N) == find(y) || find(x + 2*N) == find(y)){
                ans++;//如果x的猎物是y或者x的天敌是y,肯定不行
                continue;
            }
            unity(x, y);//二者是同类
            unity(x + N, y + N);//猎物相同
            unity(x + 2*N, y + 2*N);//天敌相同
        } 
        else if(a == 2){//如果x的猎物是y
            if(x == y){//不能相等,可有可无吧
                ans++;
                continue;
            }
            if(find(x + 2*N) == find(y) || find(y) == find(x)){
                ans++;//y不能是x的天敌和同类
                continue;
            }
            unity(x, y + 2*N);//x是y的天敌
            unity(x + N, y);//x的猎物是y
            unity(x + 2*N, y + N);//根据A吃B,B吃C,C吃A,x的天敌是y的猎物
        }
    }
    printf("%d\n",ans);//输出
return 0;
}

总结:并查集用于处理集合的合并问题真是太强大了。

查看评论

高并发集群架构超细精讲

本内容为老男孩教育运维班18期期末架构内部精讲, 目前最新课程讲解将更加细致、完善。 内容涉及大中型集群架构的方方面面的细节 值得所有初中级运维朋友学习、了解。 ===分享内容可能涉及如下知识点=== LVS集群架构、NGINX集群架构 LVS组合NGINX集群架构。 Web缓存、DB缓存、持久化存储 NFS存储及高可用、分布式文件系统 动静分离、动态产品拆分 数据库读写分离、数据库高可用
  • 2015年05月21日 10:37

洛谷·P2024 食物链(多条件并查集)

题目描述动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B吃 C,C 吃 A。现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不...
  • qq_39553725
  • qq_39553725
  • 2017-07-31 23:41:23
  • 217

食物链 洛谷2024 并查集

题目描述动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。 现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是...
  • jpwang8
  • jpwang8
  • 2017-02-05 23:26:54
  • 213

P2024 食物链

题目描述动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B吃 C,C 吃 A。现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不...
  • TIMELORD1
  • TIMELORD1
  • 2017-03-03 20:25:45
  • 100

|洛谷|并查集|P2024 食物链

https://www.luogu.org/problem/show?pid=2024 一个点拆成3个分身 一个是原体,一个表示x吃y,一个表示x被y吃 然后模拟即可 #include #inclu...
  • Darost
  • Darost
  • 2016-12-04 11:43:55
  • 191

洛谷OJ - P2024 - 食物链(并查集)

题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B吃 C,C 吃 A。现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们...
  • qq_34594236
  • qq_34594236
  • 2017-05-20 21:05:55
  • 326

POJ 1182 食物链(并查集) 详解

POJ 1182 食物链 (并查集) 详解参考做法比较经典的并查集的题目,主要是要理解路径压缩的过程。 用0 1 2 分别表示A B C的关系。 0吃1,1吃2,2吃0. 动物王国中有三类...
  • ctsas
  • ctsas
  • 2017-01-21 21:35:14
  • 14562

POJ 1182 食物链(经典并查集)

Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。  现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道...
  • gemire
  • gemire
  • 2014-03-05 20:27:26
  • 4784

poj 1182 食物链(经典!种类并查集)

链接: http://poj.org/problem?id=1182 原题: Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形...
  • shuangde800
  • shuangde800
  • 2012-09-24 00:10:11
  • 7504

食物链(并查集,分点)

食物链完全自己做的,智商瞬间++,由此发现只要肯想,就能做出来的,还是要逼自己使劲想 果然,并查集稍微难一点的就是一个点分为各种情况的多个点,然后在相对的点对中建立关系 再进行判断,其实可以将合并...
  • zhhx2001
  • zhhx2001
  • 2016-06-27 18:55:27
  • 218
    个人资料
    持之以恒
    等级:
    访问量: 195
    积分: 273
    排名: 28万+
    文章存档