Árvore Geradora de Peso
Mínimo
Davi Martins
Fábio Ávila
Introdução

Apresentação do problema
 Diferenciação


Idéia geral do algoritmo
Algoritmo de Prim
 Leve

do problema de distâncias
modificação do algoritmo de distâncias
Algoritmo de Kruskal
 Idéia
alternativa - menor aresta disponível, se esta não
fechar ciclo

Custos
Apresentação do problema

Partindo de um Grafo G=(V,E)
 Conexo
 Não-direcionado

Deseja-se encontrar árvore geradora de peso
mínimo (T)
 Minimum
Cost Spanning Tree (MCST)
 Subgrafo de G
 Contém todos os vértices de G (conceito de árvore
geradora)
 Possui (V-1) arestas
Exemplo 1
8
7
b
c
d
9
4
2
11
a
4
i
7
14
6
8
10
h


e
1
g
2
f
Peso total: 37
Árvore não-única. Removendo a aresta (b,c) e trocando-a
pela (a,h) leva a outra árvore geradora com peso 37.
Exemplo 2
16
1
21
19
2
5
11
6
6
33
3
14
10
5


18
4
Peso total: 56
Árvore geradora de peso mínimo única.
Idéia geral do algoritmo

Algoritmo genérico
1 A  Ø
2 Enquanto A não forma uma árvore geradora faça
3
Ache uma aresta (u,v) segura para A
4
A  A U {(u,v)}
5 Retorne (A)

Resta saber como achar arestas seguras
Partições




Um corte (S,V-S) de um grafo não direcionado G=(V,E) é uma
partição de V.
Uma aresta pode atravessar um corte
Um corte respeita um conjunto de arestas se o conjunto não possuir
nenhuma aresta que atravesse o corte
Uma aresta é leve se o seu peso é o mínimo de qualquer aresta
atravessando o corte.
8
b
7
c
d
9
4
2
a
i
11
7
e
14
4
6
8
10
h
S
1
g
2
f
V-S
Teorema

Seja G=(V,E) um grafo com pesos conexo e não
direcionado. Seja A um subconjunto de E contido
em alguma MCST para G. Seja (S,V-S) um corte
que respeita A, e seja (u,v) uma aresta leve
atravessando (S,V-S). Então, a aresta (u,v) é
segura para A.
Achando uma MCST com partições parciais
8
b
7
c
d
9
4
2
11
a
14
4
i
e
6
7
8
10
h
1
g
2
f
Diferenciação do problema de distâncias

No problema de distâncias, procurava-se sempre o
caminho mais curto saindo de um vértice inicial.


A única diferença entre os dois algoritmos é que o mínimo
não é mais tomado como o comprimento total do caminho,
mas sim como o custo de uma aresta.


Guarda-se sempre a distância mínima de cada vértice ao vértice
inicial
Trabalha-se sempre com os vértices dentro da partição, buscando
sempre um vértice fora da partição atual (formando uma aresta
considerada segura)
O resto do algoritmo é basicamente o mesmo
Algoritmo de Prim


Algoritmo muito similar ao SSSP
Árvore T definida inicialmente como uma árvore contendo
apenas o vértice inicial


Seguramente, um subgrafo da MCST
Em cada iteração, procura-se achar a aresta de custo
mínimo conectando T a vértices fora de T.
Algoritmo MCST-Prim (G)
Entrada: G (um grafo conexo com pesos não direcionado)
Saída: T (uma árvore geradora de peso mínimo de G)
Início
T  Ø;
Para todo vértice w faça
w.marca  Falso;
w.custo  ;
Atribua a (x,y) uma aresta de peso mínimo em G;
x.marca  Verdadeiro;
Para todas as arestas (x,z) faça
z.aresta  (x,z);
z.custo  custo(x,z);
Enquanto existir um vértice não marcado faça
w  vértice não marcado com menor w.custo;
w.marca  Verdadeiro;
Adicione w.aresta a T;
Para todos os vértices (w,z) faça
Se não z.marca então
Se custo(w,z) < z.custo então
z.aresta  (w,z);
z.custo  custo(w,z);
Fim
4
a
b
11
8
8
7
h
a
i
1
b
c
7
c
d
9
2
4
14
6
g
d
e
f
10
f
2
g
e
h
i
Algoritmo MCST-Prim (G)
Entrada: G (um grafo conexo com pesos não direcionado)
Saída: T (uma árvore geradora de peso mínimo de G)
Início
T  Ø;
Para todo vértice w faça
w.marca  Falso;
w.custo  ;
Atribua a (x,y) uma aresta de peso mínimo em G;
x.marca  Verdadeiro;
Para todas as arestas (x,z) faça
z.aresta  (x,z);
z.custo  custo(x,z);
Enquanto existir um vértice não marcado faça
w  vértice não marcado com menor w.custo;
w.marca  Verdadeiro;
Adicione w.aresta a T;
Para todos os vértices (w,z) faça
Se não z.marca então
Se custo(w,z) < z.custo então
z.aresta  (w,z);
z.custo  custo(w,z);
Fim
16
a
b
5
21
11
19
6
f
33
c
14
10
e
d
18
a
b
c
d
e
f
Custo do Algoritmo de Prim




Depende de como se implemente os procedimentos de busca
do menor elemento. Usaremos heaps.
O procedimento de extrair o menor elemento dos candidatos
possíveis ao redor de um vértice leva no máximo (log |V|)
operações, onde |V| é o número de vértices do grafo. Essa
comparação acontece |V| vezes. Portanto, essa parte do
algoritmo tem tempo de execução O(|V| log |V|)
O último laço para é executado O(|E|) vezes no total.
Sabemos que operações de atualização em heaps é O(log |V|),
portanto esta última parte leva a O(|E| log |V|)
Somando-se os tempos dos trechos, temos:
O(|V| log |V|) + O(|E| log |V|) = O((|E| + |V|) log |V|)
Algoritmo de Kruskal

Árvore T definida inicialmente como uma floresta
contendo todos os vértices do grafo original G


Seguramente, um subgrafo da MCST
Primeiro ordena os pesos de cada aresta, partindo do
menor peso para o maior

Checa se os vértices que formam arestas candidatas não estão na
mesma árvore (ou seja, se fecha um ciclo)
Algoritmo MCST-Kruskal (G)
Entrada: G (um grafo conexo com pesos não direcionado)
Saída: T (uma árvore geradora de peso mínimo de G)
Início
T  Ø;
Para todo vértice w faça
Adicione w a T;
Ordene os pesos das arestas de T;
Para todas as arestas (x,z), na ordem crescente, faça
Se u e v não pertencem à mesma árvore então
Adicione (u,v) a T;
Fim
16
1
2
5
21
19
11
6
6
33
3
14
10
5
18
4
Algoritmo MCST-Kruskal (G)
Entrada: G (um grafo conexo com pesos não direcionado)
Saída: T (uma árvore geradora de peso mínimo de G)
Início
T  Ø;
Para todo vértice w faça
Adicione w a T;
Ordene os pesos das arestas de T;
Para todas as arestas (x,z), na ordem crescente, faça
Se u e v não pertencem à mesma árvore então
Adicione (u,v) a T;
Fim
8
4
7
b
c
d
9
2
11
a
7
4
i
e
14
6
8
10
h
1
g
2
f
Custo do Algoritmo de Kruskal



O procedimento para ordenar as arestas é O(|E| log |E|),
obedecendo os critérios de algoritmos de ordenação por
comparação.
Os tempos da parte de detecção dos vértices fazendo parte da
mesma árvore e junção dos vértices são O(|E| log |E|),
determinado usando as heurísticas de união por classificação
e compressão de caminho.
Portanto, o tempo do algoritmo de Kruskal é
O(|E| log |E|)
Conclusão


Tradução da parte de MCST do Manber disponível
para consulta.
Consultar livro “Introduction to Algorithms”,
Thomas H. Cormen, Charles E. Leiserson e Ronald L. Rivest
 Apresentação
mais amigável do assunto
Download

Slides