Vou seguir as notas do Hagerup, que a princípio tem o método mais simples para verificação de árvores.
Estou tentando entender melhor o processo de verificação. A princípio ele só é linear em árvores que são full branching trees (FBT) (Todos os nós internos tem ao menos 2 filhos e todas as folhas da árvore estão na mesma altura).
A ideia do algoritmo de verificação é a seguinte:
- Temos uma árvore geradora
$T$ que queremos checar se é mínima - Seja
$HeavyEdge(U, V)$ o custo da aresta mais pesada no caminho de$U \rightarrow V$ usando apenas arestas de$T$ . - Para isso, temos que garantir que para toda aresta
$(U, V, W) \notin T$ vale que$W >= HeavyEdge(U, V)$ . Caso contrário, poderiamos incluir essa aresta$(U, V, W)$ em T e estariamos diminuindo seu custo total. - Para que isso possa ser resolvido em tempo linear, é necessário verificar a condição mencionada acima para todas as arestas que não pertencem a
$T$ . Para fazer isso em tempo linear é necessário responder a query$HeavyEdge(x, y)$ em tempo constante.
Vou seguir a implementação descrita por esse paper (https://www.researchgate.net/publication/220752994_An_Even_Simpler_Linear-Time_Algorithm_for_Verifying_Minimum_Spanning_Trees) e vou resumir os passos tomados.
Passo 1 - Transformar a sua árvore geradora