并查集【模板】
2014-02-02 10:26
423 查看
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint
Sets)的合并及查询问题。常常在使用中以森林来表示。
INPUT
第一行:三个整数n,m,p,(n< =5000,m< =5000,p< =5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 以下m行:每行两个数Mi,Mj,1< =Mi,Mj< =N,表示Mi和Mi具有亲戚关系。 接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
主要操作
1.初始化
把每个点所在集合初始化为其自身。
通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
2.查找
查找元素所在的集合,即根节点。
3.合并
将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。
完整代码
Sets)的合并及查询问题。常常在使用中以森林来表示。
INPUT
第一行:三个整数n,m,p,(n< =5000,m< =5000,p< =5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 以下m行:每行两个数Mi,Mj,1< =Mi,Mj< =N,表示Mi和Mi具有亲戚关系。 接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
主要操作
1.初始化
把每个点所在集合初始化为其自身。
通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
for(i=1;i<=N;i++) { father[i] = i; }
2.查找
查找元素所在的集合,即根节点。
int father[500010]; int find(int x) { if(father[x]!=x) father[x] = find(father[x]); return father[x]; }
int judge(int a,int b) { a = find(a); b = find(b); if(a==b) return 1; else return 0; }
3.合并
将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。
void merge(int a,int b) { a = find(a); b = find(b); father[a] = b; }
完整代码
# include<stdio.h> # include<string.h> int father[500010]; int find(int x) { if (father[x]!=x) father[x]=find(father[x]); return father[x]; } int main() { int n,m,p; scanf("%d%d%d",&n,&m,&p); for (int i=1;i<=n;i++) //初始化集合 father[i]=i; for (int i=1;i<=m;i++) //合并集合 { scanf("%d%d",&a,&b); a=find(a); b=find(b); father[a]=b; } for(int i=1;i<=p;i++) //询问关系 { scanf("%d%d",&a,&b); a=find(a); b=find(b); if(a==b) printf("Yes"); else printf("No"); } return 0; }
相关文章推荐
- ASP.NET MVC4 学习参考
- $releasever 不正确解析
- jQuery插件flexigrid使用总结
- TSPopover的一个bug
- gdb常用调试命令汇总!
- 题目1180:对称矩阵
- 个性域名时代,.COM还有人爱吗?
- 乐观锁与悲观锁
- 天澤履 (易經大意 韓長庚)
- 有状态,无状态对象是什么概念
- Vijos 1061
- HTML表单、HTTP Get与Post杂谈
- linux stat 命令查看文件信息
- struts2中使用拦截器(Interceptor)控制登录和权限
- VMware Bridged NAT Host-only 区别
- 在Android应用中使用自定义证书的HTTPS连接(下)
- 开机时提示memory for crash kernel
- USACO Number Triangles
- 关闭sendmail服务
- python decorator 计算程序时间