(并查集模板)AcWing 模板+例题240.食物链
并查集最简单的模板
#include <bits/stdc++.h>using namespace std;
int p[100010];
int n,m;
int Find(int x)//返回x的祖宗节点+路径压缩
{if(p[x]!=x)p[x]=Find(p[x]);return p[x];
}
int main()
{scanf("%d %d",&n,&m);for(i=1;i<=n;i++)p[i]=i;while(m--){char op[2];scanf("%s%d%d",op,&a,&b);if(op[0]=='M')p[Find(a)]=Find(b);//给a的祖宗认了个爹;else{if(Find(a)==Find(b))puts("Yes");else puts("No");}}return 0;
}
例题:食物链
动物王国中有三类动物 A,B,CA,B,C,这三类动物的食物链构成了有趣的环形。
AA 吃 BB,BB 吃 CC,CC 吃 AA。
现有 NN 个动物,以 1∼N1∼N 编号。
每个动物都是 A,B,CA,B,C 中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这 NN 个动物所构成的食物链关系进行描述:
第一种说法是
1 X Y
,表示 XX 和 YY 是同类。第二种说法是
2 X Y
,表示 XX 吃 YY。此人对 NN 个动物,用上述两种说法,一句接一句地说出 KK 句话,这 KK 句话有的是真的,有的是假的。
当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
- 当前的话与前面的某些真的话冲突,就是假话;
- 当前的话中 XX 或 YY 比 NN 大,就是假话;
- 当前的话表示 XX 吃 XX,就是假话。
你的任务是根据给定的 NN 和 KK 句话,输出假话的总数。
输入格式
第一行是两个整数 NN 和 KK,以一个空格分隔。
以下 KK 行每行是三个正整数 D,X,YD,X,Y,两数之间用一个空格隔开,其中 DD 表示说法的种类。
若 D=1D=1,则表示 XX 和 YY 是同类。
若 D=2D=2,则表示 XX 吃 YY。
输出格式
只有一个整数,表示假话的数目。
数据范围
1≤N≤500001≤N≤50000,
0≤K≤1000000≤K≤100000输入样例:
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
输出样例:
3
#include <bits/stdc++.h>
using namespace std;
const int N=50010;
int n,m;
int p[N],d[N];
int Find(int x)
{if(p[x]!=x){int t=Find(p[x]);d[x]+=d[p[x]];p[x]=t;}return p[x];
}
int main()
{scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) p[i]=i;int res=0;while(m--){int t,x,y;scanf("%d %d %d",&t,&x,&y);if(x>n||y>n) res++;else{int px=Find(x);int py=Find(y);if(t==1){if(px==py&&(d[x]-d[y])%3) res++;else if(px!=py){p[px]=py;d[px]=d[y]-d[x];}}else{if(px==py&&(d[x]-d[y]-1)%3) res++;else if(px!=py){p[px]=py;d[px]=d[y]+1-d[x];}}}}printf("%d\n",res);return 0;
}
(并查集模板)AcWing 模板+例题240.食物链相关推荐
- 错题本 (并查集) acwing 4084.号码牌
题目链接 题目描述 有 nnn 个小朋友,编号 1∼n1∼n1∼n. 每个小朋友都拿着一个号码牌,初始时,每个小朋友拿的号码牌上的号码都等于其编号. 每个小朋友都有一个幸运数字,第 iii 个小朋友的 ...
- 【畅通工程 HDU - 1232 】【并查集模板题】
并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...
- 0x41.数据结构进阶 - 并查集
目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...
- C++并查集算法(详细)
C++并查集算法 什么是并查集? 并查集写法 详解 例题:洛谷 P3367.[模板]并查集 题意 代码 什么是并查集? 当我们在做图论题目的时候 经常会读到一些长这样的题目描述: -连接 a , b ...
- 每日一题——众里寻花(并查集)
学习目标: 每天睡前是否感到浑浑噩噩,一天又在不知不觉中过去,回想我今天都干了什么呢? 啊~我这一天又什么也没干,好有罪恶感啊,不行,我明天一定要好好学算法(手动狗头). 明日复明日,明日何其多?不要 ...
- 简单の暑假总结——并查集
1.1 并查集 并查集,顾名思义,它用于处理一些不交集的合并及查询问题.(废话) 一般来讲,某些题目会要求我们不断地将两个集合结合成一个集合,而且还要多次查询某两个元素是否处于同一个集合当中时,如果采 ...
- hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)
点击打开链接 C - How Many Tables Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- 2017乌鲁木齐区域赛I(带权并查集)
#include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...
- LeetCode题库:并查集问题(Python语言实现)
并查集相关知识 并查集常用模板 class UnionSet:def init_tree(self,n):self.fa = [i for i in range(n)] # 必要,记录根节点,也可能是 ...
最新文章
- 【NLP】博士笔记 | 深入理解深度学习语义分割
- 程序员们,今天就让她陪你们放松一下吧。她还有大宝剑哦。【原创】
- 复制windows对话框内容的方法
- 微服务基础架构的5个关键问题
- 搜索引擎和知识图谱那些事 (上).基础篇
- c++中多线程传递参数原理分析
- 6 日期字符串转日期_山西省导游协会关于发放电子导游证的通知 (生成日期为2020年5月28日2020年6月3日)...
- 什么90%的人,自学python都不能学会,原来问题出在这,赶紧看看!
- 在SQL2005中,关闭SQL Browser服务,增强数据库的安全性
- 互联网35岁中年危机的来龙去脉
- 【AsyncTask整理 1】 AsyncTask几点要注意的地方
- java 去除jsonarray里面jsonarray的重复和合并数据
- Android中MVC、MVP、MVVM具体解释
- IO复用与select函数
- mongodb:修改oplog.rs 的大小size
- win2008 server 多IP配置
- tcl语言读取文件一行_TCL语言笔记:TCL基础语法
- windows11 微信双开的方法
- python爬虫抖音音乐_Python爬虫帮你打包下载所有抖音好听的背景音乐,还不快收藏一起听歌-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...
- 科大讯飞智能办公本Air电纸书阅读器,让我的工作生活更加健康
热门文章
- 《英语阅读教学与思维发展》读书笔记(二)
- OpenGL 体积光 光柱实现代码解读教程
- 区块链开发语言python_6种最常见的区块链编程语言
- 视频合并器(Video Combiner)绿色免费版 v1.1
- 电脑编程技巧与维护征稿启示
- uniapp打包安卓App流程(超详细版)
- 高速边坡安全监测解决方案
- HTML5期末大作业:电商购物网站设计——易购电商购物网页设计与实现(31页) 含论文+答辩+PPT 计算机毕设网页设计源码 HTML+CSS+JavaScript web课程设计网页规划与设计...
- uni-app页面截图保存到相册
- where 1=1永真与永假