Árvores abrangentes de custo mínimo

Propriedade do corte, algoritmos de Prim e Kruskal, florestas e empates.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Queremos ligar os cinco locais a,b,c,d,ea,b,c,d,e 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 n−1n-1 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 n−1n-1 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 SS e V∖SV\setminus S. Uma aresta atravessa o corte quando tem um extremo de cada lado. Um conjunto de arestas AA respeita o corte quando nenhuma das suas arestas o atravessa.

Supõe que AA está contido em alguma MST. Se ee é uma aresta de peso mínimo entre as que atravessam um corte respeitado por AA, então A∪{e}A\cup\{e\} continua contido em alguma MST. Dizemos que ee é segura para AA.

A prova é uma troca. Escolhe uma MST TT que contém AA. Se já contém ee, terminámos. Caso contrário, acrescentar ee cria um ciclo. Esse ciclo tem outra aresta ff que atravessa o corte, porque precisa de voltar ao lado inicial. Como o corte respeita AA, ff não pertence a AA. Temos w(e)≤w(f)w(e)\le w(f). Retirar ff deixa uma árvore abrangente de custo não superior que contém AA e ee. Por otimalidade de TT, também é uma MST.

Não criar um ciclo é necessário, mas não prova que a aresta é segura. Num triângulo com ab=1ab=1, bc=2bc=2 e ac=10ac=10, escolher primeiro acac mantém uma floresta acíclica. Porém, qualquer árvore que contenha acac custa pelo menos 11, enquanto {ab,bc}\{ab,bc\} custa 3. Não existe uma MST que complete essa escolha.

No grafo da lição, o corte S={a,b}S=\{a,b\} é atravessado por acac de peso 3, bcbc de peso 1 e bdbd de peso 4. A aresta bcbc é 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 é {bc,de,ab,cd}\{bc,de,ab,cd\}, com custo 1+1+2+2=61+1+2+2=6. 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.

ArestaDecisãoComponentes depois da decisão
bcbc, 1Aceitar{a},{b,c},{d},{e}\{a\},\{b,c\},\{d\},\{e\}
dede, 1Aceitar{a},{b,c},{d,e}\{a\},\{b,c\},\{d,e\}
abab, 2Aceitar{a,b,c},{d,e}\{a,b,c\},\{d,e\}
cdcd, 2Aceitar{a,b,c,d,e}\{a,b,c,d,e\}

Podemos parar após n−1=4n-1=4 aceitações, porque as outras arestas fechariam ciclos. O invariante tem duas partes: AA é 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 O(α(n))O(\alpha(n)) amortizado. A ordenação domina o custo: O(mlog⁡m+n)O(m\log m+n) tempo e O(n)O(n) memória auxiliar, além da lista de arestas. Num grafo simples conexo, costuma escrever-se O(mlog⁡n)O(m\log n) porque m≤n2m\le n^2 e m≥n−1m\ge n-1.

Prim

Prim cresce uma árvore a partir de uma raiz. Seja SS o conjunto já incluído. Para cada vértice exterior vv, mantém key[v], o peso da aresta mais barata de SS para vv, 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 (S,V∖S)(S,V\setminus S), por isso é segura pela propriedade do corte.

Partindo de aa no exemplo:

IncluídoAtualizações relevantesAresta escolhida
aaChaves de b=2b=2, c=3c=3Raiz, sem aresta
bbcc passa a 1; dd passa a 4abab
ccdd passa a 2; ee passa a 5bcbc
ddee passa a 1cdcd
eeNadadede

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 O((n+m)log⁡n)O((n+m)\log n). Com matriz e procura linear da menor chave, custa O(n2)O(n^2) 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 O(m)O(m) entradas e custa O(mlog⁡m+n)O(m\log m+n).

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 ab=2ab=2, bc=2bc=2 e ac=3ac=3, a MST contém abab e bcbc, custo total 4. O caminho de aa a cc 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 aa minimiza cada distância a aa. 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.

Voltar à explicação
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.

Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.