那么您需要做的就是将最小元素存储在分离集的根中。
要实现这一点,您只需要修改 Union() 以便在合并 2 个集合后,它还将更新不相交集合的最小元素。
所以所有操作仍然是 O(log n) (如果使用路径压缩或按等级联合)
甚至 O(inverse_ackerman) (如果同时使用两种优化)
伪代码(仅使用路径压缩,所以所有操作都是 O(log n)):
const int N = 10;
int P[N+1]; //stores parent of each set, initially all elements set to -1 to indicate no parent
int Min[N+1];//stores min element of each set
int Find(int u)
{
return P[u] < 0 ? u : P[u] = Find(P[u]);
}
void Union(int u, int v)
{
u = Find(u);
v = Find(v);
if(u == v)return;
Min[u] = Min[u] < Min[v] ? Min[u] : Min[v];
P[v] = u;
}
int FindMin(int u)
{
return Min[Find(u)];
}