博客
关于我
C - 食物链 并查集
阅读量:389 次
发布时间:2019-03-05

本文共 3152 字,大约阅读时间需要 10 分钟。

为了解决这个问题,我们需要处理动物王国中三种动物A、B、C的食物链关系,这些关系构成一个环。我们需要根据给定的N个动物和K句话,判断其中有多少句子是假话。

方法思路

我们可以使用并查集(Union-Find)数据结构来高效地处理同类和食物链关系。并查集能够帮助我们快速地合并和查找集合,适合处理大量数据。

具体步骤如下:

  • 初始化并查集:我们需要三个并查集结构来分别处理同类、被吃和吃的关系。
  • 处理每个句子
    • 检查是否有超出范围的情况。
    • 检查是否与已确认的真关系冲突。
    • 如果不是假话,合并相应的关系。
  • 统计假话:每次处理一个句子时,检查是否为假话,并计数。
  • 解决代码

    #include 
    #include
    using namespace std;struct UnionFind { int parent; int rank; UnionFind(int size) : parent(size), rank(0) {} int find(int x) { if (parent[x] != x) { parent[x] = find(parent[x]); } return parent[x]; } void union(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (rank[x] < rank[y]) { parent[x] = y; } else { parent[y] = x; if (rank[x] == rank[y]) { rank[x]++; } } }};int main() { int N, K; scanf("%d %d", &N, &K); int size = 3 * N * 2; UnionFind class_parent(size); UnionFind eat_parent(size); UnionFind eatby_parent(size); int ans = 0; for (int i = 0; i < K; i++) { int D, X, Y; scanf("%d %d %d", &D, &X, &Y); // 检查X或Y是否超过N if (X > N || Y > N) { ans++; continue; } // 检查X是否等于Y if (X == Y) { ans++; continue; } bool is_conflict = false; if (D == 1) { // 检查X和Y是否是同类 if (class_parent.find(X) == class_parent.find(Y)) { is_conflict = true; } else { // 检查X是否吃Y int eat_Y = Y + N; if (eat_parent.find(X) == eat_parent.find(eat_Y)) { is_conflict = true; } else { // 检查Y是否吃X int eat_X = X + N; if (eatby_parent.find(Y) == eatby_parent.find(eat_X)) { is_conflict = true; } } } } else if (D == 2) { // 检查X是否吃Y int eat_Y = Y + N; if (eat_parent.find(X) == eat_parent.find(eat_Y)) { is_conflict = true; } else { // 检查Y是否吃X int eat_X = X + N; if (eatby_parent.find(Y) == eatby_parent.find(eat_X)) { is_conflict = true; } } } if (is_conflict) { ans++; continue; } // 处理为真话,更新并查集结构 if (D == 1) { // 合并X和Y的同类 class_parent.union(X, Y); // 合并X+N和Y+N的被吃关系 eatby_parent.union(X + N, Y + N); // 合并X+2N和Y+2N的吃关系 eat_parent.union(X + 2 * N, Y + 2 * N); } else { // 合并Y和X+2N的被吃关系 eatby_parent.union(Y, X + 2 * N); // 合并Y+N和X+N的吃关系 eat_parent.union(Y + N, X + N); // 合并Y+2N和X+2N的吃关系 eat_parent.union(Y + 2 * N, X + 2 * N); } } printf("%d\n", ans); return 0;}

    代码解释

  • 并查集结构:定义了一个UnionFind结构,用于处理并查集操作,包括查找和合并。
  • 读取输入:读取N和K,然后初始化三个并查集结构。
  • 处理每个句子
    • 检查是否超出范围或重复。
    • 检查是否与已确认的真关系冲突。
    • 如果是真话,合并相应的关系。
  • 统计假话数:每次处理一个句子时,检查是否为假话,并计数。
  • 输出结果:最后输出假话的总数。
  • 转载地址:http://tcszz.baihongyu.com/

    你可能感兴趣的文章
    上周热点回顾(2.19-2.25)
    查看>>
    云计算之路-阿里云上:博客web服务器轮番CPU 100%
    查看>>
    云计算之路-阿里云上:服务器CPU 100%问题是memcached连接数限制引起的
    查看>>
    上周热点回顾(3.26-4.1)
    查看>>
    上周热点回顾(6.25-7.1)
    查看>>
    【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障
    查看>>
    工作半年的思考
    查看>>
    不可思议的纯 CSS 滚动进度条效果
    查看>>
    【CSS进阶】伪元素的妙用--单标签之美
    查看>>
    惊闻NBC在奥运后放弃使用Silverlight
    查看>>
    IE下尚未实现错误的原因
    查看>>
    创建自己的Docker基础镜像
    查看>>
    Python 简明教程 --- 20,Python 类中的属性与方法
    查看>>
    KNN 算法-理论篇-如何给电影进行分类
    查看>>
    Spring Cloud第九篇 | 分布式服务跟踪Sleuth
    查看>>
    CODING 敏捷实战系列课第三讲:可视化业务分析
    查看>>
    工作动态尽在掌握 - 使用 CODING 度量团队效能
    查看>>
    CODING DevOps 深度解析系列第二课报名倒计时!
    查看>>
    数据结构第八节(图(下))
    查看>>
    基于Mustache实现sql拼接
    查看>>