MINIMUM SPANNING TREES (MSTs, Árvores de espalhamento mínimas??) Atenção: No contexto desta disciplina MST não tem nada a ver com o "Movimento dos Sem-Terra." mas com a abreviatura de Minimum Spanning Trees, que traduzido para português seria algo como "Árvores de Espalhamento Mínimas" Contexto 1: Seja G=<V,E> um grafo não dirigido e conexo Spanning Tree: Seja G um grafo do contexto 1 acima, uma spanning tree de G é qualquer subgrafo de G´=<V,E ´> de G que é uma árvore. 1. Note que um spanning tree de G contém todos os vértices de G (V) mas seleciona algumas arestas ( 2. 3. 4. 5. 6. ). E este conjunto de arestas é tal que o grafo G´(spanning tree) é ... uma árvore. Note que é o conceito de "free tree", ou seja, não é definida uma raiz. Quantas arestas tem uma spanning tree de um grafo com n=|V| vértices e m=|E| arestas? Os algoritmos de vistação de grafos DFS e BFS geram (explicita ou implicitamente) uma spanning tree. Naquele contexto ela era vista como uma árvore com raiz. Neste contexto a raiz é (em princípio) irrelevante. A estas alturas você deve já ter concluído que um grafo pode ter várias spanning trees distintas. Duas estratégias interessantes de gerar uma spanning tree arbitrária a partir de um grafo G no quadro negro (ou melhor, no quadro branco) que obviamente podem ser transformadas em algoritmo: 1. Estratégia 1: Partindo do grafo original G e excluindo uma aresta de cada vez: 1. Posso excluir uma aresta <u,v> desde que ...<complete aqui> 2. Paro de excluir quando não existe mais ...<complete aqui> ..., ou equivalentemente, quando o número de arestas remanescentes for ... <complete aqui>. 2. Estratégia 2: Partindo de V, mas com E vazio, e inserindo uma aresta de cada vez: 1. Posso incluir uma aresta <u,v> qualquer desde que ... <complete aqui (2 condições)> 2. Paro de incluir quando ... <complete aqui>. Contexto 2: Seja G=<V,E> um grafo não dirigido, conexo evalorado: com um número inteiro associado a cada aresta. Minimum Spanning Tree (MST): Seja G um grafo do contexto 2 acima, uma MST G´de G é uma spanning tree de G cuja soma dos valores nas arestas é mínima entre todas as spanning trees possíveis. 1. O que há de errado com a frase: "Construa um algoritmo que encontre a minimum spanning tree de um grafo G (no contexto 2)?" 2. Há dois algoritmos eficientes bem conhecidos na literatura para calcular MSTs: o algoritmo de Prim e o de Kruskal (os nomes são os dos autores dos algoritmos conforme registrado na literatura). Exemplo de aplicação: Você está precisando refazer a instalação elétrica de sua casa. Para isto você precisará estender fio de cobre conectando todos os pontos de luz, interruptores, etc. Fio de cobre custa caro. Você quer economizar. "Who ya gona call?" Prim & Krusk al Electrical Associates Ltd. Eles vão modelar seu problema como um grafo completo em que o conjunto de vértices são os pontos a serem conectados e as arestas contém o valor da distância entre o par de pontos. Justamente o que você precisa é achar uma MST para este grafo. Nota: o grafo completo é só deste exemplo. A MST pode ser calculada a partir de qualquer grafo conexo. Exemplo em sala de aula: Exemplo do CLR a ser visto em aula. Algoritmos: 1. Imagine uma estratégia de "força bruta" para um algoritmo que construa uma MST. Qual o custo computacional (complexidade de tempo) de seu algoritmo? 2. Há dois algoritmos eficientes padrão descritos na literatura, que recebem o nome de seus autores: Prim e Kruskal. 3. Imagine agora uma estratégia "greedy" para um algoritmo para MST. Será que ela realmente funciona? Quer dizer, será que sua estratégia sempre resulta na "Minimum" spanning tree? Você consegue provar que sim ou que não? 4. Nesta disciplina vamos ver em detalhes um dos algoritmos mencionados acima, que é o de Prim.