Árvores Abrangentes de Custo Mı́nimo
Em inglês, Minimum Spanning Trees (MST)
Fernando Lobo
Algoritmos e Estrutura de Dados II
1 / 18
Minimum Spanning Tree
I
Input: grafo G = (V , E ) não orientado, conexo. Cada arco
(u, v ) ∈ E tem um peso associado → w (u, v ).
I
Output: Um conjunto de arcos A ⊆ E tal que:
1. A é uma árvore que conecta todos os nós do grafo (A é uma
spanning tree), e
P
2. w (A) = (u,v )∈A w (u, v ) é mı́nimo.
I
Problema tem muitas aplicações práticas. Por exemplo, na
construção de uma rede de comunicações.
2 / 18
Exemplo de uma MST
Custo: 6 + 5 + 9 + 7 + 15 + 8 + 3 = 53
3 / 18
Propriedades de uma MST
I
Tem |V | − 1 arcos.
I
Não tem ciclos.
I
Pode não ser única.
Vamos ver dois algoritmos distintos para obter uma MST. Ambos
são exemplos de algoritmos greedy.
4 / 18
Problema tem subestrutura óptima
MST T :
(outros arcos do grafo não aparecem)
5 / 18
Problema tem subestrutura óptima
Se retirarmos um arco (u, v ) ∈ T , ficamos com duas sub-árvores:
T1 e T2
6 / 18
Problema tem subestrutura óptima
Teorema
I
I
A sub-árvore T1 é uma MST do grafo G1 = (V1 , E1 ), o
sub-grafo de G induzido pelos nós de T1 .
I
V1 = nós de T1
I
E1 = {(x, v ) ∈ E : x, y ∈ V1 }
A mesma coisa para T2 .
7 / 18
Demonstração
Por redução ao absurdo
I
w (T ) = w (T1 ) + w (T2 ) + w (u, v )
I
Se existisse uma spanning tree T10 com menor custo que T1
em G1 , então T 0 = {T10 ∪ T2 ∪ (u, v )} seria uma spanning tree
de G com menor custo que T , o que é uma contradição.
8 / 18
Propriedade de escolha greedy
I
O problema tem outra propriedade importante: Uma escolha
óptima local também é uma escolha óptima global → greedy
choice property.
9 / 18
Propriedade de escolha greedy
Para vermos isso, necessitamos de algumas definições:
I
Um corte (S, V − S) é uma partição dos nós V em dois
conjuntos: S e V − S.
I
Um arco (u, v ) ∈ E atravessa o corte (S, V − S) se um dos
extremos estiver em S e o outro em V − S.
I
Um corte respeita A sse não existir nenhum arco em A que
atravesse o corte.
I
Um arco diz-se leve se o seu peso for o mı́nimo de todos os
arcos que atravessam o corte (pode haver mais do que um
arco leve).
10 / 18
Exemplo
I
Corte (S, V − S)
I
Temos 3 arcos que atravessam o corte: (x, y ), (u, v ), (p, z).
I
(u, v ) é um arco leve para o corte (S, V − S).
11 / 18
Definição de um arco seguro (safe edge)
I
Seja A um conjunto de arcos ⊆ MST.
I
(u, v ) é um arco seguro para A sse A ∪ {(u, v )} ⊆ MST.
Teorema:
I
Seja A um subconjunto de uma MST, e seja (S, V − S) um
corte que respeita A. Se (u, v ) for um arco leve para o corte
(S, V − S), então (u, v ) é um arco seguro para A.
I
Por outras palavras, (u, v ) pertence a uma MST.
12 / 18
Demonstração
A → arcos a vermelho. (u, v ) é um arco leve.
13 / 18
Demonstração (cont.)
I
Seja T uma MST que contém A e que não inclui (u, v ).
I
Se não contém (u, v ), terá de conter pelo menos outro arco
que atravessa o corte (S, V − S). Seja esse arco (x, y ).
I
Então (x, y ) está no caminho de u ; v em T
(ver figura, caminho p).
14 / 18
Demonstração (cont.)
I
Se retirarmos (x, y ), partimos T em 2 sub-árvores.
Acrescentando (u, v ) juntamos outra vez as sub-árvores e
obtemos uma nova spanning tree
T 0 = T − {(x, y )} ∪ {(u, v )}.
I
Como (u, v ) é um arco leve,
=⇒
w (u, v ) ≤ w (x, y )
=⇒
w (T 0 ) ≤ w (T )
=⇒
T 0 é uma MST
15 / 18
Algoritmo genérico para obter uma MST
I
Isto dá origem a um algoritmo genérico para obter uma MST.
I
Algoritmo mantém um conjunto A de arcos que é sempre um
subconjunto de alguma MST.
I
Inicialmente A = ∅
I
A cada iteração acrescentamos um arco a A mantendo o
invariante que A continue a ser um subconjunto de uma MST
=⇒ apenas acrescentamos arcos seguros a A.
16 / 18
Pseudocódigo
Generic-MST(G )
A=∅
while A is not a spanning tree
find an edge (u, v ) that is safe for A
A = A ∪ {(u, v )}
return A
17 / 18
Algoritmo genérico para obter uma MST
I
A parte interessante é como descobrir os arcos seguros.
I
Na próxima aula veremos dois algoritmos que são exemplos
concretos deste algoritmo genérico.
1. Algoritmo de Prim: Começa com um nó s qualquer e cresce
uma árvore A a partir de s. Em cada iteração, acrescenta o
arco (u, v ) de custo mı́nimo em que um dos extremos pertence
a A.
2. Algoritmo de Kruskal: Começa com A = ∅. Ordena os arcos do
grafo por ordem crescente de peso. A cada iteração acrescenta
o arco (u, v ) a A desde que isso não dê origem a um ciclo.
18 / 18
Download

Minimum Spanning Tree