归并集

来源:互联网 发布:淘宝ebay代购靠谱吗 编辑:程序博客网 时间:2024/05/22 01:47
/********************************** * 归并集 :) * 包括find和union两个操作 * find 定义为查找到data的根 * union_oper 定义为归并两个树 * 其中find的过程会对路径进行压缩 * union的时候通过秩引导降低树高 * * author : huangkq19989 * blog : http://blog.csdn.net/kangquan2008 * * ********************************/#include <stdio.h>#include <stdlib.h>#define SIZE 5int parent[SIZE];int rank[SIZE];//-1,0,2,3,4,6,7,9,1,-1//0  1 2 3 4 5 6 7 8  9int 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;}

原创粉丝点击