1.5.13 #
解答 #
官方实现:WeightedQuickUnionPathCompressionUF。
加权 quick-union 中,两个大小相等的树合并可以有效增加高度,同时输入必须保证是根节点以规避路径压缩。
代码 #
WeightedQuickUnionPathCompressionUF.cs 从 WeightedQuickUnionUF.cs 继承,详情参见 1.5.3 的解答。
public class WeightedQuickUnionPathCompressionUf : WeightedQuickUnionUf
{
/// <summary>
/// 新建一个大小为 n 的并查集。
/// </summary>
/// <param name="n">新建并查集的大小。</param>
public WeightedQuickUnionPathCompressionUf(int n) : base(n)
{
Size = new int[n];
for (var i = 0; i < n; i++)
{
Size[i] = 1;
}
}
/// <summary>
/// 寻找一个结点所在的连通分量。
/// </summary>
/// <param name="p">需要寻找的结点。</param>
/// <returns>该结点所属的连通分量。</returns>
public override int Find(int p)
{
Validate(p);
var root = p;
while (root != Parent[p])
{
root = Parent[p];
}
while (p != root)
{
var newP = Parent[p];
Parent[p] = root;
p = newP;
}
return root;
}
}
Main 方法
var uf = new WeightedQuickUnionPathCompressionUf(10);
// 见中文版 P146 或英文版 P229 中加权 quick-union 的最坏输入。
uf.Union(0, 1);
uf.Union(2, 3);
uf.Union(4, 5);
uf.Union(6, 7);
uf.Union(0, 2);
uf.Union(4, 6);
uf.Union(0, 4);
var id = uf.GetParent();
for (var i = 0; i < id.Length; i++)
{
Console.Write(id[i]);
}
Console.WriteLine();