Grafos Msc. Daniele Carvalho Oliveira 1 2 Pontes de Königsberg (1736) 3 O que são Grafos Conjunto pontos. Grafo de pontos e linhas que conectam os é um modelo matemático que representa relações entre objetos. 4 O que são Grafos Grafos são estruturas de dados largamente usadas em computação. Exemplos de aplicações são: Modelagem de circuitos digitais Representação de processos em sistemas paralelos ou distribuídos, Redes Redes Sociais Recuperação de Informação 5 O que são Grafos Similar a árvores e listas, com menos restrições 6 7 Definição Um Grafo é um par ordenado 𝐺 = (𝑉, 𝐸) 𝑉 é um conjunto finito não-vazio. Os elementos de 𝑉 são denominados vértices. 𝐸 é um conjunto finito de pares ordenados de vértices. Os elementos de 𝐸 são denominados arestas. Dois vértices ligados por uma aresta são denominados adjacentes 8 Exemplo 𝑉 = 0,1,2,3,4 𝐸 = { 1,2 , 1,3 , 1,4 , 3,4 } 9 Conceitos de Grafos 10 Laços, Arestas Múltiplas e Multigrafo 11 Grafo Trivial e Grafo Simples A B C 12 Grafo Completo 13 Grafo Regular Não é Grafo Regular Grafo Regular de grau 3 14 Subgrafo 15 Caminho simples, trajeto e ciclos Um Caminho é uma sequência de vértices 𝑣1 , 𝑣2 , … , 𝑣𝑘 , tal que (𝑣𝑖 , 𝑣𝑖+1 ) ∈ 𝐸 𝐺 Quando todos os vértices do caminho são distintos, recebe o nome de caminho simples. Quando todas as arestas são distintas, o caminho recebe o nome de trajeto Um ciclo é um caminho 𝑣1 , 𝑣2 , … , 𝑣𝑘 , tal que 𝑣1 = 𝑣𝑘 e 𝑘≥3 16 Caminho Trajeto: Ciclo: simples: 2,1,3,4 1,3,4,1,2 1,3,4,1 17 Grafo Conexo e Desconexo 18 Grafo Ponderado 3 5 1 4 2 6 7 8 19 Dígrafo 20 Dígrafo Grafo Orientado Deve-se respeitar a orientação das arestas 21 Dígrafo Grau de entrada: número de arestas que incidem no vértice Vértice Fonte: grau de entrada = 0 Grau de saída: número de arestas que partem do vértice Vértice Sumidouro: grau de saída = 0 22 Árvores Um Grafo 𝑇(𝑉, 𝐸) Não possui ciclos Conexo Seja 𝑣 ∈ 𝑉, se 𝑣 possui grau menor ou igual a 1, então 𝑣 é uma folha Uma árvore com 𝑛 vértices possui 𝑛 − 1 arestas. Um grafo 𝐺 é uma árvore, se, e somente se, existir um único caminho entre cada par de vértices de 𝐺. 23 24 Representação de Grafos 25 Como representar grafos em nossos algoritmos? Estruturas de dados! Matrizes Matriz de Adjacência Matriz de Incidência Listas Listas de Adjacência 26 Matriz de Adjacência Dado um grafo 𝐺(𝑉, 𝐸) Uma Matriz de Adjacência 𝑀 é formada por 𝑛 linhas e 𝑛 colunas 𝑛 = número de vértices do grafo 1, 𝑠𝑒 𝑖, 𝑗 ∈ 𝐸(𝐺) 𝑀𝑖𝑗 = 0, 𝑠𝑒 𝑖, 𝑗 ∉ 𝐸(𝐺) 27 1 2 3 4 5 1 0 1 0 0 1 2 1 0 1 1 0 3 0 1 0 1 0 4 0 1 1 0 1 5 1 0 0 1 1 28 1 2 3 4 5 1 0 1 0 0 1 2 0 0 1 0 0 3 0 1 0 0 0 4 0 1 1 0 0 5 0 0 0 1 1 29 Matriz de Adjacência O espaço reservado para armazenar as informações da matriz é da ordem 𝑂 𝑉 2 Para buscar uma aresta: 𝑂(1) 30 Matriz de Incidência Dado um grafo 𝐺(𝑉, 𝐸) de 𝑛 vértices e 𝑚 arestas 1, ∀𝑣𝑖 , 𝑠𝑒 𝑣𝑖 , 𝑣𝑗 ∈ 𝐸 𝐺 𝑀𝑖𝑗 = 0, 𝑠𝑒 𝑣𝑖 , 𝑣𝑗 ∉ 𝐸 𝐺 0, 𝑠𝑒 𝑣𝑖 , 𝑣𝑖 ∈ 𝐸 𝐺 31 e1 e2 e3 e4 e5 e6 e7 e8 e8 e7 e1 e5 e6 e4 e2 e3 1 1 0 0 0 0 0 1 0 2 1 1 1 0 1 0 0 0 3 0 1 1 1 0 0 0 0 4 0 0 0 1 1 1 0 0 5 0 0 0 0 0 1 1 0 32 1, ∀𝑣𝑖 , 𝑠𝑒 𝑣𝑖 , 𝑣𝑗 ∈ 𝐸 𝐺 𝑀𝑖𝑗 = −1, ∀𝑣𝑗 , 𝑠𝑒 𝑣𝑖 , 𝑣𝑗 ∈ 𝐸 𝐺 0, 𝑠𝑒 𝑣𝑖 , 𝑣𝑗 ∉ 𝐸 𝐺 0, 𝑠𝑒 𝑣𝑖 , 𝑣𝑖 ∈ 𝐸 𝐺 33 e1 e2 e3 e4 e5 e6 e7 e8 e8 e7 e1 e5 e6 e4 e2 e3 1 1 0 0 0 0 0 1 0 2 -1 1 -1 0 -1 0 0 0 3 0 -1 1 -1 0 0 0 0 4 0 0 0 1 1 -1 0 0 5 0 0 0 0 0 1 -1 0 34 Matriz de Incidência O espaço reservado para armazenar as informações da matriz é da ordem 𝑂 |𝑉| × |𝐸| Para buscar uma aresta: 𝑂(1) 35 Lista de Adjacência Consiste em um vetor 𝐴𝑑𝑗 com 𝑛 = |𝑉| entradas Cada entrada 𝐴𝑑𝑗[𝑣] possui uma lista encadeada de vértices adjacentes à 𝑣. 36 1 5 2 2 1 4 3 2 4 4 5 2 5 1 4 3 3 37 1 5 2 3 3 2 4 2 5 4 2 3 38 Matriz de Incidência O espaço reservado para armazenar as informações da matriz é da ordem 𝑂 |𝑉| + |𝐸| Para buscar uma aresta: 𝑂(𝑛) Para descobrir se existe a aresta (𝑖, 𝑗) deve-se percorrer a lista do nó 𝑖 até encontrar (ou não) 𝑗 39 Busca em Grafos 40 Algoritmos de Busca Operação mais comum em Grafos Visita sistemática a seus nós (uma única vez!) Similar Para às buscas em árvore passear ou caminhar pelos vértices e arestas, utiliza-se marcar um vértice quando ele já foi visitado. 41 Algoritmos de Busca Dois tipos básicos de busca Busca em Profundidade Busca em Largura 42 Busca em Profundidade 43 1 5 2 2 1 4 3 2 4 4 5 2 5 1 4 3 3 44 Busca em Profundidade Para acessar todos os vértices do grafo, a busca em profundidade varre a lista de adjacência de cada vértice do grafo Assim, o tempo gasto para a operação é 𝑂(|𝑉| + |𝐸|) 45 Busca em Largura 46 Distâncias Fila 1 1 2 3 4 5 ∞ ∞ ∞ ∞ ∞ 1 5 2 3 3 2 4 2 5 4 2 3 47 Distâncias Fila 1 2 3 4 5 0 ∞ ∞ ∞ ∞ 1 5 2 3 3 2 4 2 5 4 2 3 48 Distâncias Fila 5 2 1 2 3 4 5 0 1 ∞ ∞ 1 1 5 2 3 3 2 4 2 5 4 2 3 49 Distâncias Fila 2 1 2 3 4 5 0 1 ∞ ∞ 1 1 5 2 3 3 2 4 2 5 4 2 3 50 Distâncias Fila 2 1 2 3 4 5 0 1 ∞ ∞ 1 1 5 2 3 3 2 4 2 5 4 2 3 51 Distâncias Fila 2 4 1 2 3 4 5 0 1 ∞ 2 1 1 5 2 3 3 2 4 2 5 4 2 3 52 Distâncias Fila 4 1 2 3 4 5 0 1 ∞ 2 1 1 5 2 3 3 2 4 2 5 4 2 3 53 Distâncias Fila 4 1 2 3 4 5 0 1 ∞ 2 1 1 5 2 3 3 2 4 2 5 4 2 3 54 Distâncias Fila 4 3 1 2 3 4 5 0 1 2 2 1 1 5 2 3 3 2 4 2 5 4 2 3 55 Distâncias Fila 3 1 2 3 4 5 0 1 2 2 1 1 5 2 3 3 2 4 2 5 4 2 3 56 Distâncias Fila 3 1 2 3 4 5 0 1 2 2 1 1 5 2 3 3 2 4 2 5 4 2 3 57 Distâncias Fila 1 2 3 4 5 0 1 2 2 1 1 5 2 3 3 2 4 2 5 4 2 3 58 Distâncias Fila 1 2 3 4 5 0 1 2 2 1 1 5 2 3 3 2 4 2 5 4 2 3 59 Busca em Largura Primeiro os vértices são inicializados, ou seja, marcados como não visitados. O vetor de distâncias é inicializado com ∞ em todas as posições Este processo de inicialização gasta tempo 𝑂(|𝑉|) 60 Busca em Largura A medida que os vértices são encontrados, são colocados em uma fila As operações de inserção e remoção da fila gastam tempo 𝑂(1) Como todos os vértices são colocados e retirados da fila, o tempo total é 𝑂(|𝑉|) 61 Busca em Largura Como cada vértice é colocado na fila apenas 1 vez, a lista de adjacência de cada um só é analisado 1 vez Tempo 𝑂(|𝐸|) Portanto o tempo de execução da busca em largura é 𝑂(|𝑉| + |𝐸|)