Árvores abrangentes de custo mínimo
Propriedade do corte, algoritmos de Prim e Kruskal, florestas e empates.
Queremos ligar os cinco locais do grafo abaixo pelo menor custo total de construção. Num grafo não dirigido, conexo e ponderado, uma árvore abrangente contém todos os vértices, é conexa e não tem ciclos. Tem sempre arestas. Uma árvore abrangente de custo mínimo, MST, minimiza a soma dos pesos.
Pesos negativos são permitidos: a ausência de ciclos continua a limitar a solução a arestas, por isso a MST continua bem definida. A MST minimiza o custo de ligar todos os locais. Os caminhos mínimos minimizam distâncias a partir de uma origem. Um atalho pode encurtar um caminho sem pertencer à MST, como mostra a última secção.
A propriedade do corte
Um corte divide os vértices em e . Uma aresta atravessa o corte quando tem um extremo de cada lado. Um conjunto de arestas respeita o corte quando nenhuma das suas arestas o atravessa.
Supõe que está contido em alguma MST. Se é uma aresta de peso mínimo entre as que atravessam um corte respeitado por , então continua contido em alguma MST. Dizemos que é segura para .
A prova é uma troca. Escolhe uma MST que contém . Se já contém , terminámos. Caso contrário, acrescentar cria um ciclo. Esse ciclo tem outra aresta que atravessa o corte, porque precisa de voltar ao lado inicial. Como o corte respeita , não pertence a . Temos . Retirar deixa uma árvore abrangente de custo não superior que contém e . Por otimalidade de , também é uma MST.
Não criar um ciclo é necessário, mas não prova que a aresta é segura. Num triângulo com , e , escolher primeiro mantém uma floresta acíclica. Porém, qualquer árvore que contenha custa pelo menos 11, enquanto custa 3. Não existe uma MST que complete essa escolha.
No grafo da lição, o corte é atravessado por de peso 3, de peso 1 e de peso 4. A aresta é a mais leve. Se o conjunto já escolhido respeita esse corte e pertence a alguma MST, a prova anterior garante que podemos acrescentá-la. É essa condição, além da ausência de ciclos, que precisamos de manter em cada passo.
Vídeo complementar em inglês: Gulosos e árvores abrangentes, aula 16 de 6.046J, 2005 (MIT OpenCourseWare). Para perceber por que uma escolha local pode ser segura, acompanha a troca de arestas na prova da MST e distingue a escolha do algoritmo da prova que a justifica.
Um exemplo para os dois algoritmos
Uma MST é , com custo . Kruskal e Prim chegam a esse custo por ordens diferentes: um escolhe arestas por peso global, o outro cresce a partir de uma raiz.
Kruskal
Kruskal começa com cada vértice numa componente separada. Ordena todas as arestas por peso e aceita uma aresta se os extremos ainda estiverem em componentes distintas. Une então essas componentes.
| Aresta | Decisão | Componentes depois da decisão |
|---|---|---|
| , 1 | Aceitar | |
| , 1 | Aceitar | |
| , 2 | Aceitar | |
| , 2 | Aceitar |
Podemos parar após aceitações, porque as outras arestas fechariam ciclos. O invariante tem duas partes: é uma floresta e existe uma MST que o contém. Quando uma aresta liga componentes diferentes, é a mais leve disponível a atravessar o corte de uma dessas componentes, pelo que a propriedade do corte conserva a segunda parte.
Usa union-find para testar representantes e unir componentes. Com compressão de caminhos e união por rank ou tamanho, as operações custam amortizado. A ordenação domina o custo: tempo e memória auxiliar, além da lista de arestas. Num grafo simples conexo, costuma escrever-se porque e .
Prim
Prim cresce uma árvore a partir de uma raiz. Seja o conjunto já incluído. Para cada vértice exterior , mantém key[v], o peso da aresta mais barata de para , e o extremo interior dessa aresta em pai[v].
A cada passo retira o vértice exterior com menor chave e inclui a sua ligação. Depois atualiza as chaves com as arestas que saem do vértice novo. Esta aresta é a mais leve a atravessar , por isso é segura pela propriedade do corte.
Partindo de no exemplo:
| Incluído | Atualizações relevantes | Aresta escolhida |
|---|---|---|
| Chaves de , | Raiz, sem aresta | |
| passa a 1; passa a 4 | ||
| passa a 2; passa a 5 | ||
| passa a 1 | ||
| Nada |
A chave é um peso de aresta, não uma distância à raiz. Em Dijkstra atualizaríamos com dist[u] + peso. Em Prim comparamos apenas peso. Confundir estas atualizações resolve outro problema, como mostram as dúvidas sobre fixar vértices com pesos negativos.
Com heap binário e decreaseKey, Prim custa . Com matriz e procura linear da menor chave, custa e pode ser adequada num grafo denso. A variante que coloca arestas numa heap e descarta as que já têm os dois extremos incluídos pode guardar entradas e custa .
Grafos desconexos e empates
Se o grafo é desconexo, não existe uma árvore abrangente de todos os vértices. Kruskal termina com uma floresta abrangente de custo mínimo, uma árvore por componente. Prim a partir de uma única raiz cobre apenas essa componente. Para produzir uma floresta, reinicia-o em cada vértice ainda por incluir. Uma componente isolada contribui zero arestas e custo zero.
Uma heap vazia ou uma chave infinita num grafo desconexo não deve tornar-se uma aresta fictícia. Guarda separadamente a condição “não existe ligação”.
Pesos iguais podem permitir várias MST. Num triângulo com os três pesos iguais a 1, qualquer par de arestas é uma MST de custo 2. Prim e Kruskal podem devolver árvores diferentes e ambos estar corretos. Uma regra de desempate torna o resultado determinístico, mas não faz parte da definição do ótimo. Se todos os pesos forem distintos, a MST é única, como se demonstra aplicando a troca ao primeiro desacordo entre duas árvores.
MST e caminhos mínimos são problemas distintos
Num triângulo com , e , a MST contém e , custo total 4. O caminho de a nessa árvore custa 4, embora o caminho mínimo no grafo seja a aresta direta de custo 3.
A MST minimiza a soma de todas as suas arestas. Uma árvore de caminhos mínimos a partir de minimiza cada distância a . A primeira pode usar menos custo total. A segunda pode ter de incluir uma ligação mais cara para encurtar uma distância. Decide qual é o objetivo antes de escolher entre Prim e Dijkstra.
Exercícios
Árvores ótimas diferentes
Um grafo é um ciclo de quatro vértices, com as quatro arestas de peso 2 e sem diagonais. Quantas MST distintas existem?
Pista
Uma árvore abrangente precisa de três das quatro arestas.
Solução
Existem quatro MST, uma por cada aresta retirada do ciclo, cada uma com custo 6. Não podemos incluir as quatro, pois haveria ciclo; retirar duas deixaria apenas duas arestas, insuficientes para ligar quatro vértices.
Erros frequentes
Uma regra de desempate devolve uma dessas árvores, mas não torna a solução matemática única.
Componentes e pesos negativos
Há seis vértices 0 a 5 e só três arestas: 0–1 de peso 2, 1–2 de peso -1 e 3–4 de peso 5. Explica o que Kruskal devolve, o custo e por que não há nenhuma árvore abrangente para todo o grafo.
Pista
Conta as componentes, incluindo o vértice isolado 5.
Mais uma pista
As componentes são {0,1,2}, {3,4} e {5}. Nenhuma aresta fecha ciclo.
Solução
Kruskal aceita as três arestas e produz uma floresta com três componentes. O custo é -1+2+5=6 e há n-c=6-3=3 arestas. Não existe árvore abrangente de todos os vértices porque faltam ligações entre componentes. O peso negativo não invalida Kruskal; a prova do corte compara pesos, sem exigir positividade.
Confere a tua resposta:
- Identifiquei três componentes.
- Obtive três arestas e custo 6.
- Distingui floresta e árvore abrangente.
Erros frequentes
Tentar atingir n-1 arestas num grafo desconexo pode causar leitura fora da lista. Não inventes uma ligação de peso infinito para o vértice isolado.