图论算法-并查集
2017-04-27 11:13
99 查看
初始化把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] ); /* 路径压缩 */
}
合并的时候先比较规模,由于是负数,更大值更小。
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] ); /* 路径压缩 */
}
相关文章推荐
- 【OI之路】03图论算法-3并查集
- 图论算法----并查集中的路径压缩
- 图论算法(7) --- 用并查集求最小生成树
- 20140725 【 并查集 】 HDOJ 1198 Farm Irrigation
- Codeforces 659F Polycarp and Hay 并查集
- 便 加权并查集
- POJ 2524 Ubiquitous Religions(简单的并查集)
- PAT天梯赛练习题——L3-003. 社交集群(并查集按秩合并)
- Supermarket POJ - 1456------贪心加并查集
- poj2524(并查集基础基础基础题)
- POJ 2524 Ubiquitous Religions (并查集)
- P3367 【模板】并查集
- 【并查集】强迫症患者的福音
- hdu 4907(并查集)
- HDU 1213 How Many Tables(模板——并查集)
- POJ 1611 The Suspects(并查集)
- [并查集] BZOJ 4243 交朋友
- POJ 2236 Wireless Network 并查集
- POJ1988-Cube Stacking(带权并查集)
- 食物链(并查集,分点)