Fevereiro - 009
Definição de Grafo Listas de Adjacências de Técnicas da Classificação das Arestas Aplicação do de de 4 Grafo Transposto
Definição de Grafo Listas de Adjacências de Exemplos de Aplicação em Computação Verificar a existência de um caminho entre um objeto e outro (uma cidade e outra) Calcular a distância entre um objeto e outro (pontos de um metrô) Determinar quais objetos podem ser alcançados a partir de um determinado objeto (navegação na web)
Representação de Definição de Grafo Listas de Adjacências de Um grafo é constituído de um conjunto de vértices e um conjunto de arestas conectando pares de vértices. Um grafo pode ser orientado ou não orientado. 4 5 6 4 5 grafo orientado grafo não orientado
Definição de Grafo Listas de Adjacências de Definição de Grafo Um grafo orientado é um par (V, E) em que V é um conjunto finito de vértices e E é um conjunto de arestas com uma relação binária em V. 4 5 6 V={,,,4,5,6} E={(,),(,4),(,5),(,5),(,6),(4,),(5,4),(6,6)} Um grafo não orientado é um par (V, E) em que E é constituído de pares de vértices não ordenados. As arestas (u, v) e (v, u) são consideradas como única. V = {,,,4,5} E = {(,),(,4),(,),(,4),(,5),(,5),(4,5)} 4 5
Listas de Adjacências de Definição de Grafo Listas de Adjacências de Um grafo G = (V, E) pode ser representado por uma lista de adjacências, definida a partir de um arranjo de listas, uma para cada vértice em V. Para cada u V, a lista de adjacências Adj[u] contém (ponteiros para) todos os vértices v que podem ser alcançados diretamente a partir de u (existe uma aresta (u, v) E). A ordem de armazenamento dos vértices em cada lista de adjacências é arbitrária.
Definição de Grafo Listas de Adjacências de Representação de Listas de Adjacências 4 5 6 5 4 grafo orientado grafo não orientado 4 5 6 5 4 5 4 6 6 lista de adjacências 4 5 5 5 4 5 4 lista de adjacências 4
Ciclos Definição de Grafo Listas de Adjacências de Em um grafo orientado, um caminho (v 0, v, v,..., v k ) forma um ciclo se v 0 = v k e o caminho contém pelo menos uma aresta. 0 4 O caminho (0,,,,0) forma um ciclo 5 Em um grafo não orientado, v 0, v, v,..., v k forma um ciclo se v 0 = v k e o caminho contém pelo menos três arestas. Em ambos os casos, o ciclo é simples se os vértices v, v,..., v k são distintos. Um grafo sem ciclos é um grafo acíclico.
Técnicas da Classificação das Arestas A busca em profundidade é um algoritmo para caminhar no grafo, com a estratégia de buscar o mais profundo no grafo, sempre que possível. Na busca, as arestas são exploradas a partir do vértice v mais recentemente descoberto que ainda possui arestas não exploradas saindo dele. Quando não existem mais arestas a serem exploradas, a busca anda para trás. A busca em profundidade é a base para os algoritmos de: ordenação topológica obtenção dos componentes fortemente conectados
Técnicas da Classificação das Arestas Sempre que um vértice v é descoberto a partir de um u, a busca registra este evento atribuindo u a uma estrutura chamada antecessor[v]. Para acompanhar o andamento da busca, cada vértice recebe as cores branca, cinza ou preta. No início os vértices estão todos brancos. O tempo de descoberta do vértice (tornado cinza) é registrado em d[v] e o tempo de término do exame da lista de adjacentes de v é registrado em t[v] (nesse momento v se torna preto).
Técnicas da Classificação das Arestas Progresso do Percurso em Profundidade ( / ) ( / ) ( / ) 0 0 0 (a) (b) (c) Ao lado de cada vértice é indicado (tempo-de-descoberta / tempo-de-término).
Técnicas da Classificação das Arestas Progresso do Percurso em Profundidade ( / ) ( / ) ( / ) ( / ) ( / ) ( / 5 ) 0 0 0 ( / ) ( / 4 ) ( / 4 ) (d) (e) (f)
Técnicas da Classificação das Arestas Progresso do Percurso em Profundidade ( / 6 ) ( / 5 ) ( / 6 ) ( / 5 ) ( / 6 ) ( / 5 ) 0 0 0 ( / 4 ) ( / 4 ) ( 7 / ) ( / 4 ) ( 7 / 8 ) (g) (h) (i)
Técnicas da Classificação das Arestas de BuscaEmProfundidade(G) For Each vertice u em V Do cor[u] := BRANCO antecessor[u] := NIL 4 tempo := 0 5 For Each vertice u em V 6 Do If cor[u] = BRANCO 7 Then VisitaBEP(u) Fim VisitaBEP(u) cor[u] := CINZA tempo := tempo + d[u] := tempo 4 For Each v em Adj[u] 5 Do If cor[v] = BRANCO 6 Then antecessor[v] := u 7 VisitaBEP(v) 8 cor[u] := PRETO 9 tempo := tempo + 0 t[u] := tempo Fim Sempre que um vértice v é descoberto durante uma varredura na lista de adjacências de um vértice já descoberto u, a busca em profundidade registra u como antecessor de v.
Classificação das Arestas Técnicas da Classificação das Arestas A pode ser utilizada para a classificação das arestas de um grafo G = (V, E). Durante a, cada aresta (u, v) pode ser classificada na primeira vez em que é percorrida, através da cor do vértice v alcançado: Branco indica uma aresta de árvore; Cinza indica uma aresta de retorno; Preto indica uma aresta de avanço quando d[u] < d[v] e indica uma aresta de cruzamento quanto d[u] > d[v]
Classificação das Arestas Técnicas da Classificação das Arestas A classificação das arestas pode ser utilizada para verificar se um grafo orientado é acíclico ou contém um ou mais ciclos. Se uma aresta de retorno for encontrada durante a Busca em Profundidade, então existe um ciclo. O grafo abaixo contém um ciclo, e ao lado de cada aresta é mostrado o tipo (arv, ret, avan ou cruz). ( / 6 ) 0 arv ( / 5 ) ret arv cruz ( / 4 ) ( 7 / 8 ) ret
Aplicação do de de A de um grafo orientado acíclico G = (V, E) é uma ordenação linear de todos os seus vértices tal que se G contém uma aresta (u, v) então u aparece antes de v. Uma ordenação topológica de um grafo fornece a ordem em que as atividades devem ser processadas.
Aplicação do de de Os grafos orientados acíclicos são usados para indicar precedências entre eventos. Uma aresta direcionada num grafo orientado acíclico indica que a atividade u deve ser realizada antes da v. meias sapatos calças cinto camisa gravata relogio paleto
Aplicação do de de Aplicação do de Aplicação do algoritmo de para a marcação dos tempos de descoberta e término em cada vértice de um trecho do exemplo anterior: camisa calças camisa calças camisa calças gravata cinto gravata cinto gravata cinto paleto paleto paleto (a) (b) (c)
Aplicação do de de Aplicação do de camisa calças camisa calças camisa calças gravata cinto gravata cinto gravata ( / 5) cinto paleto ( / 4) paleto ( / 4) paleto (d) (e) (f)
Aplicação do de de Aplicação do de camisa ( / 8 ) calças camisa calças camisa calças gravata ( / 5) cinto (6 / ) ( / 5) gravata cinto (6 / 7) gravata ( / 5) cinto (6 / 7) ( / 4) paleto ( / 4) paleto ( / 4) paleto (g) (h) (i)
Aplicação do de de Aplicação do de ( / 8 ) (9 / ) ( / 8 ) (9 / 0 ) camisa calças camisa calças gravata ( / 5) cinto (6 / 7) gravata ( / 5) cinto (6 / 7) paleto ( / 4) paleto ( / 4) (j) (k)
Aplicação do de de Apresentação de Grafo com camisa ( / 8 ) (9 / 0 ) calças gravata ( / 5) cinto (6 / 7) ( / 4) paleto calças camisa cinto gravata paleto (9 / 0 ) ( / 8 ) (6 / 7) ( / 5) ( / 4) O grafo com ordenação topológica apresenta seus vértices organizados da esquerda para a direita, em ordem de tempo de término decrescente.
de Aplicação do de de O algoritmo simples a seguir ordena topologicamente um grafo acíclico orientado utilizando o algoritmo de Busca em Profundidade: OrdenacaoTopologica(G) Chamar BuscaEmProfundidade(G) para calcular o tempo de término t[v] para cada vértice v A medida que cada vértice é terminado, inserir o vértice à frente de uma lista ligada Retornar a lista ligada de vértices Fim
Exercício Dirigido Aplicação do de de Mostre a ordenação de vértices produzida pelo algoritmo OrdenacaoTopologica(G) quando ele é executado sobre o grafo acíclico orientado abaixo: meias sapatos calças cinto camisa gravata relogio paleto
Grafo Transposto de um Grafo Os componentes conexos de um grafo são as classes de equivalência de vértices sob a relação é acessível a partir de. Um grafo orientado é fortemente conectado se cada um de dois vértices quaisquer é acessível a partir do outro. Os componentes fortemente conectados de um grafo orientado são as classes de equivalência de vértices sob a relação são mutuamente acessíveis.
Grafo Transposto de um Grafo Grafo orientado G e seus componentes fortemente conectados: 4 Grafo G 4 Componentes Fortemente Conectados
Definição de Grafo Transposto Grafo Transposto O algoritmo para a obtenção dos componentes fortemente conectados em um grafo orientado G utiliza o grafo transposto G T de G. Grafo Transposto Seja o grafo orientado G = (V, E). O grafo transposto de G é definido como sendo o grafo G T = (V, E T ), onde E T = {(u, v) : (v, u) E}. Isto é, E T contém as arestas de G com suas direções invertidas.
Exemplo de Grafo Transposto Grafo Transposto Os grafos G e G T possuem os mesmos componentes fortemente conectados: 4 4 Grafo G Grafo G T 4 4 Componentes Fortemente Conectados
Grafo Transposto para Obtenção de Componentes Fortemente Conectados O algoritmo simples a seguir apresenta o algoritmo para obter os componentes fortemente conectados utilizando a Busca em Profundidade: ObterCFC(G) Chamar BuscaEmProfundidade(G) para calcular o tempo de término t[u] para cada vértice u Gerar GT Chamar BuscaEmProfundidade(GT), realizando a busca a partir do vértice de maior t[u] obtido na linha. Se a nova busca n~ao alcançar todos os vértices, reiniciar uma nova busca em profundidade a partir do vértice de maior t[u] dentre os restantes 4 Retornar os vértices de cada arvore da floresta obtida na busca da linha como um componente fortemente conectado separado Fim
Grafo Transposto Execução do A execução do algoritmo no grafo G se inicia no vértice 0 e são calculados os tempos de descoberta e término. O grafo transposto G T é gerado, e a busca em profundidade em G T resulta em duas árvores: raiz em 0 e raiz em. ( / 8 ) ( / 7 ) arv 0 ( / 6 ) ( / 4 ) ret 0 0 avan ret arv cruz arv arv arv cruz ( 4 / 5 ) ( / 6 ) ( 7 / 8 ) ( / 5 ) Grafo Orientado Grafo Transposto Arvores Resultantes
Execução do Grafo Transposto As duas árvores: raiz em 0 e raiz em representam os componentes fortemente conectados do grafo, e um grafo de componentes acíclicos pode ser obtido pela condensação dos componentes fortemente conectados de G. ( / 8 ) 0 arv ( / 7 ) ( / 6 ) 0 ret ( / 4 ) 0 0 avan ret arv cruz arv arv arv cruz ( 4 / 5 ) ( / 6 ) ( 7 / 8 ) ( / 5 ) Grafo de Componentes Grafo Orientado Grafo Transposto Arvores Resultantes Aciclico
Bibliografia Utilizada Grafo Transposto Nívio Ziviani. Projeto de s com Implementações em Pascal e C. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. s - Teoria e Prática.