Ну, все, что вам нужно сделать, это сохранить минимальный элемент в корне набора disjoin.
Чтобы реализовать это, вам просто нужно изменить Union (), чтобы после объединения двух наборов также обновлялся минимальный элемент для непересекающегося набора.
Таким образом, все операции по-прежнему 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)];
}