并查集入门与代码模板
2018-03-25 19:55
225 查看
并查集:
并查集算法在天梯赛和pat甲级里属于必须掌握的算法之一。原理及适用范围:
给定一组数据及他们之间的关系,问任意两个元素是否在一个集合内。(例如,给定一个家谱,问某两个人是否是亲戚)很容易想到的是暴力搜索,但随着数据量的增加这种查找显然会超时。而并查集的原理则是在每一个集合中确定一个代表元,判断两个元素是否是一个集合只需要查看对应的代表元是否在相同。这将只需要O(1)时间即可完成查询。并查集其实是森林。并不关心一个集合内的两个元素具体是怎样的联系
并查集的代码实现:
一般来说并查集需要三个操作,初始化,查询,合并。数据结构可采用多个数组或结构体。本文采用数组讲解。初始化:
parent[]数组:parent[i]=a; 表示i的父亲是a。初始化所有的数据自己是自己的父亲。[cpp]12e9b
view plain copy for(int i=1;i<=n;i++)
parent[i]=i;
合并:
将两个元素放在一个集合(一棵树上)
void unio(int a,int b) { int ra=find(a);//查询a元素所在集合的代表元(即它的祖先)。 int rb=find(b); if(ra!=rb) parent[rb]=ra;//两个元素如果代表元不同,则把其中一个作为另一个的代表元。由此形成一棵树的形式。 }查询:如何判断两个元素是否属于一个集合呢。该函数返回他们的代表元。
[cpp] view plain copy int find(int x)
{
int root=x;
while(parent[root]!=root)
root=parent[root];
while(parent[x]!=root){
int t=parent[x];
parent[x]=root;
x=t;
}//循环的目的是路径压缩,是O(1)完成查询的关键,为了防止树的退化。把该元素及它所有的祖先的 父亲 全部设置为代表元.
return root;
}
相关文章推荐
- 并查集模板代码实现(非递归)
- solr入门之lucene的索引操作之增加,删除,修改,查询及查询解析代码模板
- kruskal_并查集_代码模板 &hdu1232
- SDL入门(二)代码模板
- 【T4实践(一)】模板生成代码入门
- YII入门 (4) -- 自定义Gii生成代码模板
- YII入门 (4) -- 自定义Gii生成代码模板
- 并查集模板代码
- Eclipse 代码模板入门
- 宽搜入门代码模板详解 HDOJ1253
- 【并查集入门专题1】E - The Suspects poj1611【并查集模板】
- C#分析数据库结构,使用XSL模板自动生成代码 - 清清月儿 .NET万花筒 Asp.net技术 Asp.net教程 Asp.net源码 Asp.net基础 Asp.net控件 Asp.net入门 - CSDNBlog
- 【并查集入门专题1】A+B+D 三道模板题 hdu1232 hdu1233 poj2524【并查集模板】
- 算法模板学习专栏之并查集(一)入门
- c++中 模板与重载入门代码
- HDU 1213 How Many Tables(并查集入门模板题)
- Erlang入门:gen_server代码模板
- 新手编程入门二:使用“模板模式”减少重复代码
- kruskal_并查集_代码模板_hdu1232
- T4模板生成代码入门1