浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html

题目传送门:https://www.luogu.org/problemnew/show/P2024

对于每个生物,我们都可以将其拆成三个点,一个是自己\(self\),一个是食物\(eat\),一个是天敌\(enemy\),然后对于每一句话我们分别判断:

如果\(x\)与\(y\)是同类:如果\(x_{eat}=y_{self}\)或\(y_{eat}=x_{self}\)则是假话,否则分别对应合并三个集合。

如果\(x\)吃\(y\):如果\(x_{self}=y_{self}\)或\(y_{eat}=x_{self}\)则是假话,否则就合并\(x_{eat}\)与\(y_{self}\),\(x_{enemy}\)与\(y_{eat}\),\(x_{self}\)与\(y_{enemy}\)

时间复杂度:\(O(\alpha{n})\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
using namespace std; const int maxn=1.5e5+5; int n,m,ans;
int fa[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int find(int x) {
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
} int main() {
n=read(),m=read();
for(int i=1;i<=n*3;i++)fa[i]=i;
for(int i=1;i<=m;i++) {
int opt=read(),a=read(),b=read();
if(a>n||b>n) {ans++;continue;}
if(opt==2&&a==b) {ans++;continue;}
int a_self=find(a),a_eat=find(a+n),a_enemy=find(a+(n<<1));
int b_self=find(b),b_eat=find(b+n),b_enemy=find(b+(n<<1));
if(opt==1) {
if(a_eat==b_self||b_eat==a_self) {ans++;continue;}
fa[a_self]=b_self,fa[a_eat]=b_eat,fa[a_enemy]=b_enemy;
}
else {
if(a_self==b_self||b_eat==a_self) {ans++;continue;}
fa[a_eat]=b_self,fa[a_self]=b_enemy,fa[a_enemy]=b_eat;
}
}
printf("%d\n",ans);
return 0;
}

洛谷【P2024】[NOI2001]食物链的更多相关文章

  1. 洛谷 P2024 [NOI2001]食物链 解题报告

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...

  2. 洛谷 P2024 [NOI2001]食物链 (并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...

  3. 洛谷 P2024 [NOI2001]食物链

    题意简述 有人用两种说法对这 N 个动物所构成的食物链关系进行描述: 1."1 X Y",表示 X 和 Y 是同类. 2."2 X Y",表示 X 吃 Y . ...

  4. 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)

    传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...

  5. 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护

    先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...

  6. Java实现 洛谷 P2024 [NOI2001]食物链

    输入输出样例 输入 #1 100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5 输出 #1 3 import java.util.Scanner; pub ...

  7. [洛谷P2024/POJ1182]食物链 - 带偏移量的并查集(2)

    Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

  8. 种族并查集模板题分析 -----P2024 [NOI2001]食物链

    本文参考了:洛谷p2024题解 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都 ...

  9. 洛谷 P4017 最大食物链计数

    洛谷 P4017 最大食物链计数 洛谷传送门 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写 ...

  10. 【题解】P2024 [NOI2001]食物链 - 数据结构 - 并查集

    P2024 [NOI2001]食物链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 动物王国中有三类动物 \(A,B ...

随机推荐

  1. shell set 命令

    用set命令可以设置各种shell选项或者列出shell变量.单个选项设置常用的特性.在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o参数将关闭某些特性,不带任何参数的set命令将显示sh ...

  2. P4317 花神的数论题

    题目 洛谷 数学方法学不会%>_<% 做法 爆搜二进制下存在\(i\)位\(1\)的情况,然后快速幂乘起来 My complete code #include<bits/stdc++ ...

  3. Windos Server Tomcat 双开配置

    Tomcat 双开配置 tomcat_1   server.mxl文件 # 修改端口 <Connector port=" protocol="HTTP/1.1" c ...

  4. SpringBoot 通用Validator

    第一步,pom.xml引入hibernate-validator <dependency> <groupId>org.hibernate</groupId> < ...

  5. SQL题

    1.取出sql表中第31到40的记录(以自动增长ID为主键) sql server方案: select top 10 * from t where id not in (select top 30 i ...

  6. <转>xshell的快捷键

    xshell中现有的快捷键 快捷方式键 说明 Alt + N 与文件菜单的新建相同 Alt + O 与文件菜单的打开相同 Alt + C 与文件菜单的断开相同 Alt + Enter 切换到全屏模式 ...

  7. hive学习6

    将查询结果集写入另一个表中的时候报了这个错,Dynamic partition strict mode requires at least one static partition column. T ...

  8. R语言笔记002——sample()函数

    sample()函数 sample(x,size,replace=FALSE) x表示一个或多个向量,size表示从x中随机取的样本个数,replace=FALSE表示不放回抽样,即不会选取到相同的值 ...

  9. jquery01-简介+语法+选择器+事件

    jQuery是一个JavaScript函数库,是一个轻量级的"写的少,做的多"的JavaScript库,包含以下功能: HTML 元素选取 HTML 元素操作 CSS 操作 HTM ...

  10. js中对象的类型

    js中的类型分为三种,"内部对象"."宿主对象"."自定义对象" 1."内部对象"有Date.Function.Arra ...