A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Árvore Geradora de Peso Mínimo

Apresentações semelhantes


Apresentação em tema: "Árvore Geradora de Peso Mínimo"— Transcrição da apresentação:

1 Árvore Geradora de Peso Mínimo
Davi Martins Fábio Ávila

2 Introdução Apresentação do problema Idéia geral do algoritmo
Diferenciação do problema de distâncias Idéia geral do algoritmo Algoritmo de Prim Leve modificação do algoritmo de distâncias Algoritmo de Kruskal Idéia alternativa - menor aresta disponível, se esta não fechar ciclo Custos

3 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

4 Exemplo 1 8 7 b c d 4 9 2 a i e 11 4 14 7 6 8 10 h g f 1 2 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.

5 Exemplo 2 Peso total: 56 Árvore geradora de peso mínimo única. 1 2 6 3
16 1 2 5 21 11 6 3 19 6 33 14 10 5 4 18 Peso total: 56 Árvore geradora de peso mínimo única.

6 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

7 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 7 b c d 4 9 2 S a 11 i 4 14 e 7 6 8 10 V-S h g f 1 2

8 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.

9 Achando uma MCST com partições parciais
8 7 b c d 4 9 2 a i e 11 4 14 7 6 8 10 h g f 1 2

10 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. Guarda-se sempre a distância mínima de cada vértice ao 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. 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

11 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.

12          b c d a i e h g f 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 8 7 b c d 4 9 2 a 11 i 4 e 14 7 6 8 10 h g f 1 2

13 a b f c e d 16 5 21 11 19 6 33 14 10 18 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 f 6 c 33 14 10 e d 18

14 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|)

15 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)

16 1 2 6 3 5 4 16 5 21 11 19 6 33 14 10 18 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 11 6 3 19 6 33 14 10 5 4 18

17 b c d a i e h g f 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 7 b c d 4 9 2 a 11 i 4 e 14 7 6 8 10 h g f 1 2

18 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|)

19 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


Carregar ppt "Árvore Geradora de Peso Mínimo"

Apresentações semelhantes


Anúncios Google