并查集模板
来源:互联网 发布:java判断上午还是下午 编辑:程序博客网 时间:2024/06/17 00:19
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入输出格式
输入格式:第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi
当Zi=1时,将Xi与Yi所在的集合合并
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N
输出格式:如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N
输入输出样例
输入样例#1:
4 72 1 21 1 22 1 21 3 42 1 41 2 32 1 4
输出样例#1:
NYNY
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据,N<=10,M<=20;
对于70%的数据,N<=100,M<=1000;
对于100%的数据,N<=10000,M<=200000。
#include<cstdio>const int maxn=10010;int n,m;struct Set{ int count; int parent;}set[maxn];void Init(){ for(int i=0;i<n;i++){ set[i].count=1; set[i].parent=i; }}int Find(int x){ int y=x; while(set[y].parent!=y)y=set[y].parent; while(set[x].parent!=x){ int temp=set[x].parent; set[x].parent=y; x=temp; } return y;}void Union(int x,int y){ x=Find(x),y=Find(y); if(x==y)return; if(set[x].count>set[y].count){ set[y].parent=x; set[x].count+=set[y].count; } else{ set[x].parent=y; set[y].count+=set[x].count; }}int main(){ scanf("%d%d",&n,&m); Init(); for(int i=0;i<m;i++){ int Z,X,Y; scanf("%d%d%d",&Z,&X,&Y); X--,Y--; if(Z==1)Union(X,Y); if(Z==2) if(Find(X)==Find(Y))printf("Y\n"); else printf("N\n"); } return 0;}
阅读全文
0 0
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 【模板】并查集
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集【模板】
- 并查集 模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集 模板
- 并查集模板
- ORA-12514: TNS: 监听程序没法识别连接描述符中请求的服务
- 【Java Web】MyEclipse安装成功打不开以及Tomcat启动不成功的解决方法
- 通过应用委托传递窗口事件
- [笔记]《操作系统精髓与设计原理》---(2)进程
- Angular路由 ng-route和ui-router的区别
- 并查集模板
- easyui树加载的时候想传参数
- Tomcat实现session保持的三种方式、使用msm方式搭建jsp网站
- NOI2001-食物链
- git下版本提交回退
- 如何实现邮箱验证
- JavaJDBC学习-JDBC
- HIGHCHARTS意外发现的一个神奇的网站
- Kotlin 学习之属性和字段