POJ 1182 食物链(并查集较高级的应用)

2024-08-25 08:08

本文主要是介绍POJ 1182 食物链(并查集较高级的应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

食物链
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 50803 Accepted: 14851

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句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 
1) 当前的话与前面的某些真的话冲突,就是假话; 
2) 当前的话中X或Y比N大,就是假话; 
3) 当前的话表示X吃X,就是假话。 
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。 

Input

第一行是两个整数N和K,以一个空格分隔。 
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。 
若D=1,则表示X和Y是同类。 
若D=2,则表示X吃Y。

Output

只有一个整数,表示假话的数目。

Sample Input

100 7
1 101 1 
2 1 2
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5 5


Sample Output

3

解题思路:

题目给出的判断假话的条件,2,3是可以直接判断的,1需要用到并查集比较高级的运用,我们在此分两类来讨论,一种是如果root1和root2为相同集合的话,那么可以写成向量的形式 x->y = x->root1 + root1 - > y = (-r[x] + r[y] + 3) % 3,r[x]代表x和父结点之间的关系。另一种情况root1和root2不在一个集合内,先合并,可知root1->root2 = root1 - > x + x ->y + y -> rooty = (r[x]+ D - 1 - r[y] + 3) % 3,其中x - > y 等于题目中给的D-1来表示。本题有一篇解题报告写得特别好,推荐大家看看: http://blog.csdn.net/niushuai666/article/details/6981689

AC代码:

#include<iostream>
#include<cstdio>
using namespace std;const int maxn = 50100;
struct tree
{int parent; //父节点int rank; //秩
} a[maxn];void Make_Set(int x)
{a[x].parent = x;a[x].rank = 0;
}int Find_Set(int x)
{if(x != a[x].parent) //如果不是根结点{int fx = Find_Set(a[x].parent); //递归查找a[x].rank = (a[x].rank + a[a[x].parent].rank) % 3;a[x].parent = fx;}return a[x].parent;
}bool Union(int x,int y,int D)
{int xx,yy;xx = Find_Set(x);yy = Find_Set(y);if(xx == yy){if((-a[x].rank + a[y].rank + 3) % 3 != D - 1) return true;elsereturn false;}a[yy].parent = xx;a[yy].rank = (a[x].rank + D - 1 - a[y].rank + 3) % 3;return false;
}int main()
{int m,n;int i;int op,c,d;//freopen("111","r",stdin);int cnt;cin>>m>>n;cnt = 0;for(i=1; i<=m; i++) //初始化{a[i].parent = i;a[i].rank = 0;}for(i=1; i<=n; i++){scanf("%d%d%d",&op,&c,&d);if(c > m || d > m){cnt++;continue;}if(op == 2 && c == d){cnt++;continue;}if(Union(c,d,op)){cnt++;continue;}}cout<<cnt<<endl;return 0;
}



这篇关于POJ 1182 食物链(并查集较高级的应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105007

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.