种族并查集模板题分析 -----P2024 [NOI2001]食物链
本文参考了:洛谷p2024题解
题目描述
动物王国中有三类动物 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 句话有的是真
的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
• 当前的话与前面的某些真的话冲突,就是假话
• 当前的话中 X 或 Y 比 N 大,就是假话
• 当前的话表示 X 吃 X,就是假话
你的任务是根据给定的 N 和 K 句话,输出假话的总数。
输入格式
从 eat.in 中输入数据
第一行两个整数,N,K,表示有 N 个动物,K 句话。
第二行开始每行一句话(按照题目要求,见样例)
输出格式
输出到 eat.out 中
一行,一个整数,表示假话的总数。
输入输出样例
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
3
说明/提示
1 ≤ N ≤ 5 ∗ 10^4
1 ≤ K ≤ 10^5
第一次遇到这样的题,真的是一筹莫展,自己大概想到要分成3个种族,但是并不知道怎么维护。当看了洛谷上的大神的题解,真的是醍醐灌顶。原来直接用三倍并查集可以很方便的解决这类维护种族间关系的问题。
此题可以作为一个此类种族间关系的模板来使用
大概思路:一倍存同种族,二倍存猎物,三倍存天敌。定义find(x)得x的祖先
//若x,y同种族,则同种族的同种族,x,y的猎物同种族,x,y的天敌同种族
join(x,y)
join(x+n,y+n)
join(x+*n,y+*n) find(x) == find(y)// x y同种族
find(x+n) == find(y) //y是x的猎物,也就是x吃y的关系
find(x+*n) == find(y) //x是y的猎物,也就是y吃x的关系
AC代码
#include <bits/stdc++.h>
using namespace std;
const int NN = 5e4+; int n,m;
int a[*NN]; int find(int x){ //去找公共祖先
if(x!=a[x])
a[x] = find(a[x]);
return a[x];
}
void join(int x,int y){ //合并集合
int fx = find(x),fy = find(y);
if(fx!=fy){
a[fx] = fy;
}
} int main(){
cin>>n>>m;
for(int i = ;i<=*n;i++) a[i] = i; //并查集操作前的初始化
int t,x,y;
int coun = ;//错误次数
while(m--){
scanf("%d%d%d",&t,&x,&y);
if(x>n || y>n){ //错误情况
coun++;
continue;
}
if(t == ){
if(find(x+n) == find(y) || find(x+*n) == find(y)){ //x 与 y非同种族关系
coun++;
}else{
join(x,y);join(x+n,y+n);join(x+*n,y+*n); //让x,y同种族, x,y的猎物同种族,x,y的天敌同种族
}
}else{
if(x==y){ //错误情况
coun++;
}else if(find(x) == find(y) || find(x+*n) == find(y)){ //非x吃y的关系
coun++;
}else{
join(x+n,y);join(x+*n,y+n);join(x,y+*n); //谁吃谁的关系
}
}
}
cout<<coun<<endl;
return ;
}
种族并查集模板题分析 -----P2024 [NOI2001]食物链的更多相关文章
- PAT题解-1118. Birds in Forest (25)-(并查集模板题)
如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...
- HDU 1213 - How Many Tables - [并查集模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...
- 并查集模板题----P3367 【模板】并查集
题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi ...
- 杭电ACM省赛集训队选拔赛之热身赛-How Many Tables,并查集模板题~~
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- POJ1611 The Suspects 并查集模板题
题目大意:中文题不多说了 题目思路:将每一个可能患病的人纳入同一个集合,然后遍历查找每个点,如果改点点的根节点和0号学生的根节点相同,则该点可能是病人. 模板题并没有思路上的困难,只不过在遍历时需要额 ...
- PAT甲题题解-1114. Family Property (25)-(并查集模板题)
题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...
- HDU-1232/NYOJ-608畅通工程,并查集模板题,,水过~~~
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) http://acm. ...
- HDU1232 畅通工程 (并查集模板题)
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 并查集模板题(The Suspects )HZNU寒假集训
The Suspects Time Limit: 1000MS Memory Limit: 20000KTotal Submissions: 36817 Accepted: 17860 Descrip ...
随机推荐
- NDK_OVERVIEW翻译
Android NDK Overview Introduction: The Android NDK is a set of tools that allows Android application ...
- Java编程思想:文件加锁
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...
- k8s学习 - 概念 - Deployment
k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管 ...
- SpringBoot Jpa入门案例
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons) 我们先来了解一下是什么是springboot jpa,springboo ...
- 一次使用InfluxDB数据库的总结
前言 因当前的项目需要记录每秒钟服务器的状态信息,例如负载.cpu等等信息,这些数据都是和时间相关联的. 因为一秒钟就要存储挺多的数据.而且我还在前端做了echart的折线图,使用websocket实 ...
- HTTPS协议学习笔记
在前一段时间准备面试的时候,面试官反复提到了HTTPS这个协议.我只是单纯的知道,HTTPS是安全的应用层协议 是HTTP更安全的版本,通过对称密钥加密.但是具体的其他的,可能我不太了解.今天就专门抽 ...
- Excel催化剂开源第34波-SM.MS图床API调用(用POST上传multipart/form-data内容)
日常做网抓数据,都是以GET请求为主,偶尔遇到需要POST请求的,一般POST的参数只是一串字符串就可以了,通过构造字符串也很容易完成,但此次SM.MS的API接口要求是Content-Type: m ...
- 个人永久性免费-Excel催化剂功能第48波-拆分工作薄内工作表,堪称Excel界的单反
一个工作薄有多个相同类型的工作表,然后想通过批量操作,把每个工作表都另存为一个工作薄文件,这个批量拆分工作薄,绝大多数插件都有此功能,就如懂点VBA的高级用户也常常有点不屑于用插件来完成,自己写向行V ...
- Django REST Framework(DRF)_第一篇
认识RESTful REST是设计风格而不是标准,简单来讲REST规定url是用来唯一定位资源,而http请求方式则用来区分用户行为. REST接口设计规范 HTTP常用动词 GET /books:列 ...
- vue教程(一)-html使用vue
前后端分离.微服务框架是当下比较流行的词汇,而vue就是前端框架的佼佼者.下面重点介绍一下vue的用法: vue起步:1.引包 2.启动new Vue({el:目的地,template:模板内容 ...