并查集实现
常可用来判断两个元素是否在同一个集合中,n^2的复杂度太大。
1 #include <stdio.h> 2 3 #define MAX 100 4 int parent[MAX]; 5 6 int find(int x) 7 { 8 if(x<0||x>=MAX) 9 { 10 return -1; 11 } 12 if(parent[x]==x) 13 { 14 return parent[x]; 15 }else 16 { 17 return parent[x] = find(parent[x]); 18 } 19 } 20 21 22 void init() 23 { 24 int i; 25 for(i=0;i<MAX;i++) 26 { 27 parent[i] = i; 28 } 29 } 30 31 void my_union(int i, int j) 32 { 33 if(i<0 || i>=MAX || j<0 || j>=MAX) 34 { 35 return ; 36 } 37 int px = find(i); 38 int py = find(j); 39 parent[px] = py; 40 } 41 42 int main() 43 { 44 int i; 45 init(); 46 my_union(0, 1); 47 for(i=0;i<10;i++) 48 { 49 printf("%d\n", find(i)); 50 } 51 return 0; 52 } 53 /* 54 秩的压缩,即总是把含孩子少的合并到孩子多的子树上。以减少不平衡树的产生。但是话说这个优化感觉有限。 55 路径压缩。实际是记忆搜索或者伸展树的变种。 56 */
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.