并查集最简单的模板

#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 句话有的是真的,有的是假的。

当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

  1. 当前的话与前面的某些真的话冲突,就是假话;
  2. 当前的话中 XX 或 YY 比 NN 大,就是假话;
  3. 当前的话表示 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.食物链相关推荐

  1. 错题本 (并查集) acwing 4084.号码牌

    题目链接 题目描述 有 nnn 个小朋友,编号 1∼n1∼n1∼n. 每个小朋友都拿着一个号码牌,初始时,每个小朋友拿的号码牌上的号码都等于其编号. 每个小朋友都有一个幸运数字,第 iii 个小朋友的 ...

  2. 【畅通工程 HDU - 1232 】【并查集模板题】

    并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...

  3. 0x41.数据结构进阶 - 并查集

    目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...

  4. C++并查集算法(详细)

    C++并查集算法 什么是并查集? 并查集写法 详解 例题:洛谷 P3367.[模板]并查集 题意 代码 什么是并查集? 当我们在做图论题目的时候 经常会读到一些长这样的题目描述: -连接 a , b ...

  5. 每日一题——众里寻花(并查集)

    学习目标: 每天睡前是否感到浑浑噩噩,一天又在不知不觉中过去,回想我今天都干了什么呢? 啊~我这一天又什么也没干,好有罪恶感啊,不行,我明天一定要好好学算法(手动狗头). 明日复明日,明日何其多?不要 ...

  6. 简单の暑假总结——并查集

    1.1 并查集 并查集,顾名思义,它用于处理一些不交集的合并及查询问题.(废话) 一般来讲,某些题目会要求我们不断地将两个集合结合成一个集合,而且还要多次查询某两个元素是否处于同一个集合当中时,如果采 ...

  7. hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)

    点击打开链接 C - How Many Tables Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  8. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...

  9. LeetCode题库:并查集问题(Python语言实现)

    并查集相关知识 并查集常用模板 class UnionSet:def init_tree(self,n):self.fa = [i for i in range(n)] # 必要,记录根节点,也可能是 ...

最新文章

  1. 【NLP】博士笔记 | 深入理解深度学习语义分割
  2. 程序员们,今天就让她陪你们放松一下吧。她还有大宝剑哦。【原创】
  3. 复制windows对话框内容的方法
  4. 微服务基础架构的5个关键问题
  5. 搜索引擎和知识图谱那些事 (上).基础篇
  6. c++中多线程传递参数原理分析
  7. 6 日期字符串转日期_山西省导游协会关于发放电子导游证的通知 (生成日期为2020年5月28日2020年6月3日)...
  8. 什么90%的人,自学python都不能学会,原来问题出在这,赶紧看看!
  9. 在SQL2005中,关闭SQL Browser服务,增强数据库的安全性
  10. 互联网35岁中年危机的来龙去脉
  11. 【AsyncTask整理 1】 AsyncTask几点要注意的地方
  12. java 去除jsonarray里面jsonarray的重复和合并数据
  13. Android中MVC、MVP、MVVM具体解释
  14. IO复用与select函数
  15. mongodb:修改oplog.rs 的大小size
  16. win2008 server 多IP配置
  17. tcl语言读取文件一行_TCL语言笔记:TCL基础语法
  18. windows11 微信双开的方法
  19. python爬虫抖音音乐_Python爬虫帮你打包下载所有抖音好听的背景音乐,还不快收藏一起听歌-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...
  20. 科大讯飞智能办公本Air电纸书阅读器,让我的工作生活更加健康

热门文章

  1. 《英语阅读教学与思维发展》读书笔记(二)
  2. OpenGL 体积光 光柱实现代码解读教程
  3. 区块链开发语言python_6种最常见的区块链编程语言
  4. 视频合并器(Video Combiner)绿色免费版 v1.1
  5. 电脑编程技巧与维护征稿启示
  6. uniapp打包安卓App流程(超详细版)
  7. 高速边坡安全监测解决方案
  8. HTML5期末大作业:电商购物网站设计——易购电商购物网页设计与实现(31页) 含论文+答辩+PPT 计算机毕设网页设计源码 HTML+CSS+JavaScript web课程设计网页规划与设计...
  9. uni-app页面截图保存到相册
  10. where 1=1永真与永假