图论算法-并查集

来源:互联网 发布:软件行业发展趋势 编辑:程序博客网 时间:2024/06/04 20:12

初始化把set所有值设为-1(都是根),合并两个集合的时候,先用find函数找出各个集合的根,寻找根的时候利用递归进行路径压缩,都指向根结点。

合并的时候先比较规模,由于是负数,更大值更小。

void Union( SetType S, SetName Root1, SetName Root2 ){ /* 这里默认Root1和Root2是不同集合的根结点 */    /* 保证小集合并入大集合 */    if ( S[Root2] < S[Root1] ) { /* 如果集合2比较大 */        S[Root2] += S[Root1];     /* 集合1并入集合2  */        S[Root1] = Root2;    }    else {                         /* 如果集合1比较大 */        S[Root1] += S[Root2];     /* 集合2并入集合1  */        S[Root2] = Root1;    }} SetName Find( SetType S, ElementType X ){ /* 默认集合元素全部初始化为-1 */    if ( S[X] < 0 ) /* 找到集合的根 */        return X;    else        return S[X] = Find( S, S[X] ); /* 路径压缩 */}


0 0
原创粉丝点击