/**********************************
* 归并集 :)
* 包括find和union两个操作
* find 定义为查找到data的根
* union_oper 定义为归并两个树
* 其中find的过程会对路径进行压缩
* union的时候通过秩引导降低树高
*
* author : huangkq19989
* blog : http://blog.csdn.net/kangquan2008
*
* ********************************/
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int parent[SIZE];
int rank[SIZE];
//-1,0,2,3,4,6,7,9,1,-1
//0 1 2 3 4 5 6 7 8 9
int find(int data)
{
int p = data;
// 查找data的根,用p保存
while(parent[p] != -1)
p = parent[p];
int q = data;
// 压缩
while(parent[q] != -1)
{
int tmp = q;
q = parent[q];
parent[tmp] = p;
}
return p;
}
void union_oper(int tree1,int tree2)
{
int p1 = find(tree1);
int p2 = find(tree2);
if(p1 != p2)
if(rank[p1] < rank[p2])
parent[p1] = p2;
else if(rank[p1] > rank[p2])
parent[p2] = p1;
else
{
parent[p1] = p2;
rank[p2] ++;
}
}
void print()
{
for(int i=0; i<SIZE; i++)
printf("%d ",parent[i]);
printf("\n");
}
int main()
{
for(int i=0; i<SIZE; i++)
{
parent[i] = -1;
rank[i] = 0;
}
print();
while(1)
{
printf("input the index of data you want union\n");
int a,b;
scanf("%d",&a);
scanf("%d",&b);
if(a >= SIZE || b >= SIZE)
break;
union_oper(a,b);
print();
}
return 0;
}
归并集
最新推荐文章于 2024-06-22 18:42:27 发布