Estrutura de Dados e Algoritmos e Programação e Computadores II Aula 10: Introdução aos Grafos
História O assunto que se constitui no marco inicial da teoria de grafos é na realidade um problema algorítmico. Além disso, é um problema cuja solução foi a elaboração de um algoritmo eficiente. O problema da ponte de Königsberg foi resolvido por Euler em 1736. No Rio Pregel, junto à cidade de Königsberg (hoje Kalingrado) na então Prússia, existem duas ilhas formando portanto quatro regiões distingüíveis de terra.
História Sete pontes conectam a cidade e as duas ilhas, e o problema é saber se é possível caminhar de um ponto qualquer da cidade e retornar a este ponto passando por cada ponte exactamente um vez.
História Euler resolveu este problema criando um grafo onde terra firme é vértice e ponte é aresta:
História Quando caminhamos por um vértice, nós temos que entrar e sair dele (ou vice-versa, no caso do ponto inicial). Isto significa que usamos um número par de arestas cada vez que passamos por um vértice. Como o grafo acima possui vértices com número ímpar de arestas, a resposta para o problema é NÃO.
Motivação Existem funções inúteis no programa? Considere que funções são vértices e existe aresta de f para g se existe chamada a g no corpo de f: main f k m n g h
Motivação Usando a mesma representação, podemos descobrir se um programa possui recursão directa ou indirecta. Pode existir recursão se existe ciclo no grafo. f h g
Motivação Um vendedor que passar por várias cidades, retornando ao ponto inicial, usando o trajecto de menor distância possível. Qual a menor distância entre duas cidades A e C? Como ir da cidade A a C passando pelo número mínimo de cidades? B 300 200 A 100 C 50 20 30 70
Motivação Quantas cores são necessárias para colorir um mapa no plano? B C D A E
Conceitos Preliminares Um grafo G(V,A) é definido pelo par de conjuntos V e A, onde: V - conjunto não vazio: os vértices ou nós do grafo; A - conjunto de pares ordenados a=(v,w), v e w V: as arestas do grafo. Seja, por exemplo, o grafo G(V,A) dado por: V = { p p é uma pessoa } A = { (v,w) < v é amigo de w > }
Conceitos Preliminares Esta definição representa toda uma família de grafos. Um exemplo de elemento desta família é dado por: V = { Maria, Pedro, Joana, Luiz } A = { (Maria, Pedro), (Joana, Maria), (Pedro, Luiz), (Joana, Pedro) }
Dígrafo (Grafo Orientado) Considere, agora, o grafo definido por: V = { p p é uma pessoa da família Castro } A = { (v,w) < v é pai/mãe de w > } A relação definida por A não é simétrica pois se <v é pai/mãe de w>, não é o caso de <w é pai/mãe de v>. Há, portanto, uma orientação na relação, com um correspondente efeito na representação gráfica de G. O grafo é dito ser um grafo orientado (ou dígrafo), sendo que as conexões entre os vértices são chamadas de arcos.
Dígrafo (Grafo Orientado) Um exemplo de deste grafo é: V = { Emerson, Isadora, Renata, Antonio, Rosane, Cecília, Alfredo } A = {(Isadora, Emerson), (Antonio, Renata), (Alfredo, Emerson), (Cecília, Antonio), (Alfredo, Antonio)}
Ordem A ordem de um grafo G é dada pela cardinalidade do conjunto de vértices, ou seja, pelo número de vértices de G. Nos exemplos ao lado: ordem(g1) = 4 ordem(g2) = 6
Adjacência Em um grafo simples, dois vértices v e w são adjacentes se há uma aresta a=(v,w) em G. No caso do grafo ser dirigido, a adjacência (vizinhança) é especializada em: Sucessor: um vértice w é sucessor de v se há um arco que parte de v e chega em w. Antecessor: um vértice v é antecessor de w se há um arco que parte de v e chega em w.
Grau O grau de um vértice é dado pelo número de arestas que lhe são incidentes. grau(pedro) = 3 grau(maria) = 2 No caso do grafo ser dirigido, a noção de grau é especializada em: Grau de emissão: o grau de emissão de um vértice v corresponde ao número de arcos que partem de v. Grau de recepção: o grau de recepção de um vértice v corresponde ao número de arcos que chegam a v. Um vértice v é uma fonte se grauderecepção(v) = 0. Um vértice v é um sumidouro se graudeemissão(v) = 0.
Laço Um laço é uma aresta ou arco do tipo a=(v, v), ou seja, que relaciona um vértice a ele próprio. No exemplo há três ocorrências de laços para um grafo não orientado.
Grafo Regular Um grafo é dito ser regular quando todos os seus vértices tem o mesmo grau. O grafo abaixo é dito ser um grafo regular-3 pois todos os seus vértices tem grau 3.
Grafo Completo Um grafo é dito ser completo quando há uma aresta entre cada par de seus vértices. Estes grafos são designados por Kn, onde n é a ordem do grafo. Um grafo Kn possui o número máximo possível de arestas para um dado n. Ele é, também regular-(n-1) pois todos os seus vértices tem grau n-1.
Grafo Bipartido Um grafo é dito ser bipartido quando seu conjunto de vértices V puder ser dividido em 2 subconjuntos V1 e V2, tais que toda aresta de G une um vértice de V1 a outro de V2.
Grafo Bipartido Sejam os conjuntos H={h h é um homem} e M={m h é um mulher} e o grafo G(V,A) onde: V = H M A = {(v,w) (v H e w M) ou (v M e w H) e <v foi namorado de w>}
Grafo Bipartido O grafo abaixo é uma K3,3, ou seja, um grafo bipartido completo que contém duas partições de 3 vértices cada. Ele é completo pois todos os vértices de uma partição estão ligados a todos os vértices da outra partição.
Grafo Valorado Um grafo G(V,A) é dito ser valorado quando existe uma ou mais funções relacionando V e/ou A com um conjunto de números. Como exemplo: V = {v v é uma cidade com aeroporto} A = {(v,w,t) <há linha aérea ligando v a w, sendo t o tempo esperado de vôo>}
Multigrafo Um grafo G(V,A) é dito ser um multigrafo quando existem múltiplas arestas entre pares de vértices de G. No grafo abaixo há duas arestas entre os vértices A e C e entre os vértices A e B.
Cadeia Uma cadeia é uma sequência qualquer de arestas adjacentes que ligam dois vértices. O conceito de cadeia vale também para grafos orientados, bastando que se ignore o sentido da orientação dos arcos. A sequência de vértices (x6, x5, x4, x1) é um exemplo de cadeia no grafo abaixo.
Cadeia Uma cadeia é dita ser elementar se não passa duas vezes pelo mesmo vértice. É dita ser simples se não passa duas vezes pela mesma aresta (arco). O comprimento de uma cadeia é o número de arestas (arcos) que a compõe.
Caminho Um caminho é uma cadeia na qual todos os arcos possuem a mesma orientação. Aplica-se, portanto, somente a grafos orientados. A sequência de vértices (x1, x2, x5, x6, x3) é um exemplo de caminho no grafo acima.
Ciclo e Circuito Um ciclo é uma cadeia simples e fechada: o vértice inicial é o mesmo que o vértice final. A sequência de vértices (x1, x2, x3, x6, x5, x4, x1) é um exemplo de ciclo elementar no grafo acima. Um circuito é um caminho simples e fechado. A seqüência de vértices (x1, x2, x5, x4, x1) é um exemplo de circuito elementar no grafo acima.
Fecho Transitivo O fecho transitivo directo (ftd) de um vértice v é o conjunto de todos os vértices que podem ser atingidos por algum caminho iniciando em v. Note que o próprio vértice pode fazer parte do ftd já que ele é alcançável partindo-se dele mesmo. O fecho transitivo inverso (fti) de um vértice v é o conjunto de todos os vértices a partir dos quais se pode atingir v por algum caminho. Note que o próprio vértice pode fazer parte do fti já que dele se pode alcançar ele mesmo.
Fecho Transitivo O ftd do vértice x5 do grafo G17, por exemplo, é o conjunto: {x1, x2, x3, x4, x5, x6}. O fti do vértice x5 do grafo G17, por exemplo, é o conjunto: {x1, x2, x4, x5, x7}.
Grafo Desconexo Um grafo G(V,A) é dito ser desconexo se há pelo menos um par de vértices que não está ligado por nenhuma cadeia.
Grafo Conexo Um grafo G(V,A) é dito ser conexo se há pelo menos uma cadeia ligando cada par de vértices deste grafo G.
Vértice de Corte Um vértice é dito ser um vértice de corte se sua remoção (juntamente com as arestas a ele conectadas) provoca um redução na conexidade do grafo. Os vértices x2 nos grafos abaixo são exemplos de vértices de corte.
Ponte Uma aresta é dita ser um a ponte se sua remoção provoca um redução na conexidade do grafo. As arestas (x3, x2) em nos grafos abaixo são exemplos de pontes.
Base Uma base de um grafo G(V,A) é um subconjunto B V, tal que: dois vértices quaisquer de B não são ligados por nenhum caminho; todo vértice não pertencente a B pode ser atingido por um caminho partindo de B.
Anti-Base Uma anti-base de um grafo G(V,A) é um subconjunto A V, tal que: dois vértices quaisquer de A não são ligados por nenhum caminho; de todo vértice não pertencente a A pode se atingir A por um caminho.
Raiz e Anti-Raiz Se a base de um grafo G(V,A) é um conjunto unitário, então esta base é a raiz de G. Se a anti-base de um grafo G(V,A) é um conjunto unitário, então esta anti-base é a anti-raiz de G.
Estrutura de Dados para Grafos Matriz de Adjacências Matriz de Incidências Lista de Adjacências
Matriz de Adjacências Sendo n o número de vértices de G, uma matriz de adjacência para G(V, E) é uma matriz A = (a ij ) n n, tal que a ij = 1 se (v i, v j ) E. V 1 V 1 V 2 V 3 V 4 V 1 0 1 1 0 V 2 V 3 A = V 2 1 0 0 1 V 3 1 0 0 1 V 4 V 4 0 1 1 0 V 1 V 1 V 2 V 3 V 4 V 1 0 1 1 0 V 2 V 3 A = V 2 0 0 0 1 V 3 0 0 0 0 V 4 V 4 0 1 1 0
Matriz de Adjacências A desvantagem desta representação é que ela ocupa muito espaço se há poucas arestas, a maior parte da matriz é inútil. A vantagem é que podemos saber se uma aresta existe ou não em tempo constante.
Matriz de Incidências Uma outra representação matricial possível para o grafo G(V, E) é a matriz de incidências B = (b ij ) n m, tal que b ij = 1 se vértice v i e aresta e j forem incidentes. V 1 E 1 E 2 E 3 E 4 V 1 1 1 0 0 V 2 V 3 A = V 2 1 0 1 0 V 3 0 1 0 1 V 4 V 4 0 0 1 1 Observe que cada coluna de B tem exactamente dois Uns (1 s).
Matriz de Incidências Como representar um dígrafo utilizando a matriz de incidência? V 1 E 1 E 2 E 3 E 4 E 5 V 1????? V 2 V 3 A = V 2????? V 3????? V 4 V 4?????
Lista de Adjacências Há um vetor de n posições onde cada um apontando para uma lista. A posição i do vetor aponta para uma lista contendo números j tal que (Vi, Vj) E. Para os grafos anteriores teremos: V 1 2 3 nil V 2 1 4 nil V 3 1 4 nil V 4 2 3 nil V 1 2 3 nil V 2 4 nil V 3 nil V 4 2 3 nil
Busca em Profundidade Depth-FirstSearch(DFS) Uma DFS é feita em um grafo começando em um vértice V chamado raiz da árvore. V V 1 1 7 2 6 2 4 3 5 5 3 4
Busca em Largura Breadth - First Search (BFS) Uma BFS é feita em um grafo G = (V, E) começando em um vértice V. 5 V V 3 1 a 1 b b 4 a 2 3 c d e 5 e 6 f 7 g 4 2 6 c d f 8 h
Busca em Largura Primeiro o algoritmo visita V e todos os vértices conectados a V, chamados filhos de V. BFS visita vértices W tal que (V, W) E. No segundo passo, o algoritmo visita todos os netos de V. Os vértices que não estão conectados directamente a V mas, estão conectados a algum vértice e que está conectado a V.
Exercícios Faça a busca em profundidade e em largura nos grafos abaixo: a c V d b V a b c d e f a d c V g b e
Exercícios e a c V h d f b g j e f a d c V g i b l m h i j k k