Estrutura de Dados e Algoritmos e Programação e ...cee.uma.pt/edu/eda/eda_200506/Aula11.pdf · O...
Transcript of Estrutura de Dados e Algoritmos e Programação e ...cee.uma.pt/edu/eda/eda_200506/Aula11.pdf · O...
Estrutura de Dados e Algoritmos e Programação e Computadores II
Aula 10: Introdução aos Grafos
HistóriaO 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ãodirecta ou indirecta. Pode existir recursão se existe ciclo no grafo.
• • f
h • • g
MotivaçãoUm 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 PreliminaresEsta 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ênciaEm 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çoUm 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 RegularUm 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 CompletoUm 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 BipartidoSejam 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 BipartidoO 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 ValoradoUm 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>}
MultigrafoUm grafo G(V,A) é dito ser um multigrafoquando 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.
CadeiaUma 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.
CadeiaUma 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.
CaminhoUm 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 TransitivoO 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 TransitivoO 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 CorteUm 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 conexidadedo 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-BaseUma 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-RaizSe 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ênciasMatriz de IncidênciasLista de Adjacências
Matriz de AdjacênciasSendo n o número de vértices de G, uma matriz de adjacência para G(V, E) é uma matriz A = (aij) n × n, tal que aij = 1 se (vi, vj) ∈ E.
V1 • V1 V2 V3 V4
V1 0 1 1 0 V2 • • V3 A = V2 1 0 0 1
V3 1 0 0 1 • V4 V4 0 1 1 0
V1 • V1 V2 V3 V4
V1 0 1 1 0 V2 • • V3 A = V2 0 0 0 1
V3 0 0 0 0 • V4 V4 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 = (bij) n × m, tal que bij = 1 se vértice vi e aresta ej forem incidentes.
Observe que cada coluna de B tem exactamente dois Uns (1’s).
V1 • E1 E2 E3 E4V1 1 1 0 0
V2 • • V3 A = V2 1 0 1 0V3 0 1 0 1
• V4 V4 0 0 1 1
Matriz de Incidências
Como representar um dígrafo utilizando a matriz de incidência?
V1 • E1 E2 E3 E4 E5V1 ? ? ? ? ?
V2 • • V3 A = V2 ? ? ? ? ?V3 ? ? ? ? ?
• V4 V4 ? ? ? ? ?
Lista de AdjacênciasHá 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:
V1 2 3 nil V2 1 4 nil V3 1 4 nil V4 2 3 nil
V1 2 3 nil V2 4 nil V3 nil V4 2 3 nil
Busca em Profundidade
Depth - First Search (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.
V V 3 1 a 1 b
b 4 a 2 3 c d e 5
5 e 6 f 7 g 4 2 6
c d f 8 h
Busca em LarguraPrimeiro 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 b
c d
V Vab
c d e
V
a bc
d ef g
Exercícios
a b
c d
V h
e
i
f g
e
Va b
cd i
f gh
j kj
k
l
m