会员
众包
新闻
博问
闪存
赞助商
HarmonyOS
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
1989huangkq
huangkq1989
博客园
|
首页
|
新随笔
|
新文章
|
联系
|
订阅
|
管理
归并集
/********************************** * 归并集 :) * 包括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; }
发表于
2011-10-04 20:33
huangkq1989
阅读(
455
) 评论(
0
)
收藏
举报
刷新页面
返回顶部
公告