并查集-----集合以及计算----
集合的表示
集合运算:交 , 差 , 并 , 补 , 判定一个元素是否属于某一集.?
并查集: 集合 并 , 查 某元素属于什么集合?
并查集问题中集合储存如何实现?
可以 用 树结构
/*先找 需要寻找元素的X的位置*/
int Find( SetType S[ ], ElementType X )//在数组S中查找 X { /* 在数组S 中查找值为X 的元素所属的集合 */ /* MaxSize 是全局变量 , 为数组S 的最大长度 */ int i; for ( i=0; i < MaxSize && S[i].Data != X; i++) ; if( i >= MaxSize ) return -1; /* 未找到X , 返回-1 */ for( ; S[i].Parent >= 0; i = S[i].Parent ) ; return i; /* 找到X 所属集合 , 返回树根结点在数组S 中的下标 */ }
/*找到X之后我们开始去她的祖先,最后我们返回的是需要寻找元素的祖先.*/
------------------下面开始并运算------------------------------------
分别找到X1和X2两个元素所在的集合树的根节点(在上面我们已经有代码去实现如何寻找其所在集合了.)
如果他们不同根,则将其中一个根节点的父节点指针设置成另一个根节点的数组下标.
/*轻而易举的就实现了*/ void Union( SetType S[ ], ElementType X1, ElementType X2 ) { int Root1, Root2; Root1 = Find(S, X1); Root2 = Find(S, X2); if ( Root1 != Root2 )S[Root2].Parent = Root1; }
为了改善合并以后树的高度,我们可以将小的集合合并到相对打的集合中.
-----------------------终于结束了------------下面就要开始图了------我想陈越阿姨了------