并查集 数据结构
2017-02-27 13:15
330 查看
并查集(用树形结构实现的)
有2种操作:
(1)查询元素a和元素b是否在同一组。
(2)合并元素a和元素b所在的组。
int pre
;//我们用数组下标代表每个元素,而数组pre
代表N父亲的编号,
int rank
; //rank
代表这个树的高度 // 当pre
=N时,N就是所在树的根
void init(void)
{
for(i=0;i<n;i++)
{
pre[i]=i;
rank[i]=1;
}
}
int find(int x)//找根节点,如果pre[x]==x,那么x就是其根节点
{ //否则,找pre[x]的父亲节点也就是pre[pre[x]],看看是否等于x。。。
return pre[x]==x?x:find(pre[x]);
}
void unite(int x,int y)
{
int root1,root2;
root1=find(x);//找到2个元素各自的根节点root1,root2
root2=find(y);
if(root1==root2)//如果根节点相同,那就不用合并
return ;
if(rank[root1]<rank[root2])//b=比较2个树的高度,把小树合并到大树上
pre[root1]=root2;//把小树的根节点的父亲节点指向大树的根节点root2
else
{
pre[root2]=root1;
if(rank[root1]==rank[root2])//如果2棵树高度相同,合并之后,高度会增加一
rank[root1]++;
}
}
有2种操作:
(1)查询元素a和元素b是否在同一组。
(2)合并元素a和元素b所在的组。
int pre
;//我们用数组下标代表每个元素,而数组pre
代表N父亲的编号,
int rank
; //rank
代表这个树的高度 // 当pre
=N时,N就是所在树的根
void init(void)
{
for(i=0;i<n;i++)
{
pre[i]=i;
rank[i]=1;
}
}
int find(int x)//找根节点,如果pre[x]==x,那么x就是其根节点
{ //否则,找pre[x]的父亲节点也就是pre[pre[x]],看看是否等于x。。。
return pre[x]==x?x:find(pre[x]);
}
void unite(int x,int y)
{
int root1,root2;
root1=find(x);//找到2个元素各自的根节点root1,root2
root2=find(y);
if(root1==root2)//如果根节点相同,那就不用合并
return ;
if(rank[root1]<rank[root2])//b=比较2个树的高度,把小树合并到大树上
pre[root1]=root2;//把小树的根节点的父亲节点指向大树的根节点root2
else
{
pre[root2]=root1;
if(rank[root1]==rank[root2])//如果2棵树高度相同,合并之后,高度会增加一
rank[root1]++;
}
}
相关文章推荐
- 数据结构——并查集
- 数据结构之并查集
- 数据结构之并查集
- 数据结构之并查集(Union-Find)
- 数据结构 -- 并查集
- 【并查集】数据结构与算法实验题 11.2 病毒排查问题
- sdut 1488 数据结构实验:连通分量个数(并查集)
- 数据结构之二叉树 树结构练习---判断给定森林中有多少棵树(并查集)
- 数据结构之并查集
- 数据结构之并查集
- 数据结构之并查集
- 数据结构之并查集
- 数据结构——并查集
- POJ1182 数据结构 (并查集)
- 数据结构之并查集
- 数据结构与算法(4)——并查集
- 数据结构之并查集
- 数据结构之并查集(Java版本)
- ZH奶酪:【数据结构与算法】并查集基础
- SDUT 3364-数据结构实验之图论八:欧拉回路(并查集)