Algoritmos em Grafos Buscas em Grafos Prof. André Renato 1º Semestre/2012.
Transcript of Algoritmos em Grafos Buscas em Grafos Prof. André Renato 1º Semestre/2012.
Algoritmos em Grafos
Buscas em GrafosProf. André Renato1º Semestre/2012
Buscas em GrafosUma das operações mais comuns
em estruturas de dados consiste em listar os elementos armazenados de acordo com a estruturação utilizada.
Em listas, é possível imprimir os elementos um após o outro, na mesma ordem em que se encontram na lista.
Buscas em GrafosEm árvores binárias, existe três
formas de se imprimir todos os elementos: em ordem, em pré-ordem e em pós-ordem.
4015
20
819
32 45
Buscas em GrafosOs algoritmos são simples e
utilizam eficientemente a estrutura recursiva da árvore.
Além disso, existe um nó que é diferente dos demais e através do qual é possível o percorrimento atingindo todos os demais nós: nó raiz.
Buscas em GrafosEm grafos, qual o nó raiz?Como é feita a estruturação
recursiva do grafo?A segunda pergunta é de difícil
resposta, pois nem sempre o grafo apresenta uma estruturação bem-definida (na verdade, quase nunca).
A primeira pergunta é mais simples: não existe uma raiz natural em um grafo.
Buscas em GrafosComo fazer então o
percorrimento?◦O primeiro passo consiste em
escolher um nó aleatoriamente para ser o ponto inicial do algoritmo.
◦Deve-se então adotar uma política para o processamento do nó inicial e, sucessivamente, dos seus adjacentes.
◦Existem duas políticas mais usuais, que dão origem às duas formas de buscas mais utilizadas.
Buscas em GrafosBusca em largura
◦A idéia consiste em, partindo de um nó inicial v, armazenar todos os nós u adjacentes a ele.
◦Escolher um nó u e armazenar todos os adjacentes;
◦Passar para o segundo nó u e repetir o processo até que todos os nós imediatamente adjacentes a v sejam tratados.
◦O procedimento se repete para os nós adjacentes aos nós u armazenados.
Buscas em GrafosAlém do próprio grafo, é
necessário armazenar os nós que estão sendo processados em outra estrutura de dados. Qual???
Buscas em GrafosAinda existe um problema:
normalmente é possível partir de um nó v e atingir um nó u de duas ou mais formas diferentes.
Como evitar que este tipo de processamento repetido seja evitado sem excluir previamente nenhuma possibilidade de acesso aos nós?
Buscas em GrafosUma idéia é colocar nos nós um tipo de
marcação que servirá para identificar se o nó já foi processado ou ainda não.
Um atributo booleano (ou inteiro) é suficiente para cada nó.
Inicialmente, todos os nós são marcados como “não-visitado”. O nó inicial é colocado na fila e marcado como visitado.
O algoritmo prossegue como descrito anteriormente.
Buscas em Grafos
1
3
5
2
4
6
9
7
10
8
Buscas em GrafosBusca em profundidade:
◦A idéia agora é partir de um nó inicial v e encontrar um primeiro nó adjacente u.
◦Ao invés de enfileirar o nó u e buscar outro adjacente a v, mudamos imediatamente para o primeiro nó u encontrado e repetimos as operações.
Buscas em GrafosBusca em profundidade:
◦Quando um nó u for totalmente explorado, voltamos o fluxo do algoritmo para o nó que alcançou u primeiramente.
◦Prosseguimos, então, com outro nó adjacente ainda não explorado até que todos os nós adjacente ao nó inicial tenham sido explorados.
◦Neste ponto, o fluxo do algoritmo volta para o inicial encerrando sua execução.
Buscas em GrafosA estrutura de fila utilizada na
busca em largura não faz mais sentido, pois os nós vão sendo processados à medida em que são encontrados.
No entanto, por precisar mudar constantemente o nó corrente e depois voltar por todos os nós processados até o nó inicial, outra estrutura é necessária.
Buscas em GrafosQual????Se vamos utilizar uma pilha, é
possível pensar no algoritmo através de uma abordagem recursiva?
Buscas em Grafos
1
3
5
2
4
6
9
7
10
8
Buscas em GrafosOs algoritmos de busca podem
revelar informações importantes sobre os vértices, as arestas e o próprio grafo como todo.
Para conseguir isto, precisamos alterar levemente os algoritmos, fazendo-os armazenar informações extras durante suas execuções.
Buscas em GrafosBusca em largura:
◦Distância entre os vértices: pode ser entendida como a quantidade mínima de arestas adjacentes entre dois vértices;
◦Para calcular a distância e quais arestas estão envolvidas, adicionaremos duas informações aos vértices: a distância corrente d e o vértice que o precede na busca pred.
◦Vale lembrar que a distância não leva em conta o peso das arestas.
Buscas em GrafosAs arestas indicadas pelo valor
de pred formam uma estrutura de dados conhecida. Qual?
Por que isso acontece?
Buscas em GrafosBusca em profundidade:
◦Quando um nó é visitado, não temos a menor idéia de quando o fluxo do algoritmo voltará para ele.
◦Isto depende da quantidade de nós que serão alcançados através dele.
Se imaginarmos que o algoritmo é executado de acordo com horizonte de tempo fictício onde cada visita a um nó demora uma unidade de tempo, podemos anotar quando o nó é começa a ser visitado e quando termina.
Buscas em GrafosBusca em profundidade:
◦Se imaginarmos que o algoritmo é executado de acordo com horizonte de tempo fictício onde cada visita a um nó demora uma unidade de tempo, podemos anotar quando o nó é começa a ser visitado e quando termina.
◦Teremos então duas informações além de pred: o tempo de descoberta do nó desc e o tempo de finalização do nó fim.
Buscas em GrafosOs tempos de descoberta e
finalização apresentam uma estrutura de parênteses.
Se representarmos a descoberta do nó u pelo símbolo “(u” e a finalização pelo símbolo “u), a sequência de descobertas e finalizações gera uma expressão bem formada, onde os parênteses estão corretamente aninhados.
Buscas em GrafosExemplo de estrutura de parênteses
y
x
z
w
s
v
t
u
ts
v uz
y w
x
2(z
1(s
3(y
4(x
5x)
6y)
7(w
8w)
9z)
10s)
11(t
12(v
13v)
14(u
15u)
16t)
Buscas em GrafosClassificação de arestas:
◦Pode trazer informações importantes sobre o grafo, como a existência de ciclos (que será visto posteriormente).
◦Arestas de árvore: são as arestas obtidas pela relação de precedência direta entre vértices do u e v do grafo, ao final da busca.
◦A aresta (u,v) é de árvore, se v for descoberto por esta mesma aresta.
Buscas em GrafosClassificação de arestas:
◦Arestas de retorno: são as arestas (u,v) que conectam um vértice u a um vértice v já visitado anteriormente.
◦Arestas de avanço: são as arestas (u,v) que conectam um vértice u a um vértice v descendente não-imediato.
◦Arestas de cruzamento: são as demais arestas do grafo.
Buscas em Grafos
y
x
z
w
s
v
t
u
ts
v uz
y w
x
Buscas em GrafosOrdem topológica: pode ser vista
como o posicionamento dos vértices numa linha horizontal, onde todas as arestas estão da esquerda para a direita.
A ordem topológica é aplicada a grafos direcionados que não possuam ciclos.
Buscas em Grafos
Buscas em GrafosAlgoritmo para ordem topológica:
◦Executar a busca em profundidade;◦Conforme os vértices são finalizados,
colocá-los na frente de uma lista encadeada*;
◦Retornar o início da lista;
*Pode ser utilizada uma pilha.
Buscas em GrafosComponentes fortemente
conexos: são subconjuntos maximais de vértices, onde para cada par de vértices (u,v), existe uma forma de chegar de u até v e vice-versa.
Não faz sentido em grafos não-direcionados. Por quê?????
Buscas em Grafos
1 2
5 6 7
98
3 4
Buscas em GrafosAlgoritmo para gerar os
componentes:◦Executar a busca em profundidade,
anotando os tempos de finalização de cada vértice;
◦Calcular o grafo transposto;◦Aplicar a busca em profundidade no
grafo transposto: Considerar os vértices em ordem
decrescente de seus tempos de finalização;
◦Mostrar os vértices de cada árvore como um componente fortemente conexo;
Buscas em GrafosColocar grafos de exemplo e
pseudo-codigo no final