Árvore Geradora Mínima. O problema Admita que tenhamos que conectar vértices de forma eficiente,...

Post on 17-Apr-2015

113 views 0 download

Transcript of Árvore Geradora Mínima. O problema Admita que tenhamos que conectar vértices de forma eficiente,...

Árvore Geradora Mínima

O problema

Admita que tenhamos que conectar vértices de forma eficiente, onde os vértices podem ser: computadores, telefones, etc. Uma árvore geradora mínima deve fornecer uma solução econômica, que precise de pouco cabo, tubulação, ou pouca quantidade de qualquer que seja o meio de conexão (arestas)

Definição

Uma árvore geradora de um grafo é uma árvore não-enraizada cujo conjunto de vértices coincide com o conjunto de vértices do grafo cujas arestas são (algumas das) arestas do grafo.

Portanto...

Uma árvore geradora conecta todos os vértices de um grafo sem formar ciclos.

Um dos algoritmos utilizados é o PRIM. Ele é parecido com o algoritmo para o caminho mínimo, sendo que, um grafo poderá ter mais de uma árvore geradora mínima.

Exemplo

Algoritmo PRIM

-Cria-se um conjunto IN que inicialmente terá um vértice arbitrário (z)

-Para cada vértice de (z) que não esteja em IN, avaliamos a menor distância.

-A aresta que realiza a distância mínima é então incluída na árvore geradora mínima.

-O algoritmo termina quando todos os vértices do grafo pertençam a IN.

Algoritmo PRIM(execução)

Exemplo:

c(F) = 1c(F) = 1

H

A

B

J

C

E

M L

G

D

I

F

4

7

4

3

7

5

6

2

23

1

4

2

3

8

6

4

c(F) = 3c(F) = 3c(F) = 6c(F) = 6c(F) = 9c(F) = 9c(F) = 11c(F) = 11c(F) = 13c(F) = 13c(F) = 17c(F) = 17c(F) = 21c(F) = 21c(F) = 25c(F) = 25c(F) = 28c(F) = 28c(F) = 33c(F) = 33

Algoritmo (Pseudo-código)

função Prim(G)

{

T := {} B := Um vértice de G Enquanto B não contém todos os vértices

(u,v) :=   aresta de menor peso saindo de todos os vértices em B

T :=   T U {(u,v)}B :=   B U {u}

}

Algoritmos de busca

Os problemas vistos até agora baseavam-se em alguma premissa do tipo: não passar pela mesma aresta, não passar pelo mesmo vértice, minimizar a distância percorrida, etc.

Agora veremos algoritmos onde podemos percorrer todos os vértices em uma ordem particular, mas listando todos os vértice.

Busca em profundidade

Neste procedimento, partimos de um vértice a e marcamos ele como visitado, prosseguindo para o ponto mais longe possível, até que nenhum vértice seja mais encontrado pelo caminho escolhido.

Busca em profundidadePara um grafo simples e conexo

Procedure profundidade(G, a){ marque a como visitado escreva a for (cada vertice n adjacente de a) if n não foi visitado profundidade(G, n)}

Busca em largura

Neste caso partimos do vértice a e seguimos por todos os seus adjacentes, em seguida seguimos cada um desses adjacentes, realizando a mesma operação.

Busca em Largura (usando lista)Procedure largura(G, a){

Q: Fila de verticesmarque aescreva(a)inclui(a) na filaEnquanto Q não está vaziafor cada vértice n adjacente a Q

if n não foi visitadomarque n como visitadoescreva(n)incluiNa Fila (n,Q)

TiraDaFila(q)}

AnálisesA vantagem de se utilizar lista de adjacências no lugar de matriz, é interessante para a implementação, uma vez que torna o algoritmo muito mais simples. (como seria percorrer todos os adjacentes de a, em uma matriz?)

Varrer a lista de adjacências o grafo determina a quantidade de trabalho a ser realizada em cada lado. Como existem n listas de adjacências, a quantidade de trabalho é pelo menos O(n), pois mesmo que ela esteja vazia, precisa ser verificada. Como existem M arestas, o trabalho para percorrer todas as arestas de uma lista é o(m). Portanto, os algoritmos são O(max(n,m)). O caso mais comum provavelmente é O(m) pois em geral temos mais arestas do que vértices.

Busca em arvores

Os algoritmos de busca em largura e em profundidade se aplicam a quaisquer grafos, porém, existem 3 outros algoritmos apenas para árvores que são úteis.

Pré-ordem

InOrdem

PosOrdem

ABDCEGFHI

Pré-Ordem

IN-Ordem

DBAEGCHFI

DBGEHIFCA

Pós-Ordem

PreOrdem

Procedure PreOrdem(N:Pno);

If N <> nil Then

Processa(N); {p. ex. imprime} PreOrdem(N^.esq);

PreOrdem(N^.dir);

End;

End;

InOrdem

Procedure InOrdem(N:Pno);

If N <> nil Then

InOrdem(N^.esq);

Processa(N); {p. ex: imprime}

InOrdem(N^.dir);

End;

End;

PosOrdem

Procedure PosOrdem(N:Pno)

If N <> nil Then

PosOrdem(N^.esq);

PosOrdem(N^.dir);

Processa(N); {p.ex.: imprime}

End;

End;

Exercícios

1.Crie o grafo a1(1,2,5); a2(2,5,3); a3(2,3,3); a4(4,2,3); a5(3,1,3) e faça a conexão utilizando o algoritmo PRIM

2.Percorra a árvore ao lado das 3 formas possíveis