您的位置:首页 > 理论基础 > 数据结构算法

并查集

2016-09-12 20:00 302 查看
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100

//上一级节点/集合中元素的个数
int father[maxsize],rank[maxsize];

//初始化
void init(int _size)
{
for(int i=0;i<_size;i++)
{
father[i]=i;
rank[i]=1;
}
}

//查找根节点/压缩路径
int find_set(int node)
{
/*
while(father[node] != node)
{
node=father[node];
}*/
if(father[node] != node)
father[node]=find_set(father[node]);
return father[node];
}

//合并节点
void _union(int p,int q)
{
int root1=find_set(p);
int root2=find_set(q);
if(root1 == root2)
return ;
if(rank[root1] >= rank[root2])
{
father[root2]=root1;
rank[root1] += rank[root2];
}
else
{
father[root1]=root2;
rank[root2] += rank[root1];
}

}

int main()
{
int _size;
int a,b;
while(~scanf("%d",&_size))
{
init(_size);
for(int i=0;i<5;i++)
{
scanf("%d %d",&a,&b);
_union(a,b);
}

for(int i=0;i<_size;i++)
{
find_set(i);
printf("i=%d father=%d rank=%d\n",i,father[i],rank[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构