并查集-----集合以及计算----

集合的表示

  集合运算:交 , 差 , 并 , 补 , 判定一个元素是否属于某一集.?

  并查集:  集合 并 , 查 某元素属于什么集合?

  并查集问题中集合储存如何实现?

        可以 用 树结构

/*先找  需要寻找元素的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;
}

为了改善合并以后树的高度,我们可以将小的集合合并到相对打的集合中.

-----------------------终于结束了------------下面就要开始图了------我想陈越阿姨了------

原文地址:https://www.cnblogs.com/A-FM/p/5148231.html