Algoritmos em Grafos Letícia Rodrigues Bueno UFABC
Motivação Objetivo: aprender a resolver problemas; Como: usando grafos para modelar problemas; Grafos: ferramenta fundamental de abstração; Abstraímos problema real (usando grafos) e solucionamos através de algoritmos;
Definição de Grafos Wikipedia (2012):...conjunto de pontos (vértices) ligados por retas (as arestas) Abstração que permite codificar relacionamentos entre pares de objetos; Objetos: cidades, pessoas, países, empresas, etc; Relacionamentos: amizade, conectividade, idioma, etc;
Supervisão de pós-graduação
Supervisão de pós-graduação Rodrigo Leticia Andreia Renata Felipe Jorge
Vôos Aéreos Azul Linhas Aéreas, retirado de: http://www.voeazul.com.br/
Vôos Aéreos Webjet Linhas Aéreas, retirado de: http://www.webjet.com.br/
Vôos Aéreos TAM Linhas Aéreas, retirado de: http://www.tam.com.br/
Número de Bacon Fonte: http://oracleofbacon.org/
Número de Bacon Fonte: http://oracleofbacon.org/
Representação Computacional: Lista de Adjacências (a) G (b) Lista de Adjacências de G Vantagem: espaço em memória Θ(n + m). Desvantagem: determinar se aresta está em G exige percorrer lista de adjacências.
Representação Computacional: Matriz de Adjacências (c) H (d) Matriz de Adjacências de H Vantagem: determinar se aresta está em G exige O(1). Desvantagem: espaço em memória Θ(n 2 ).
Representação Computacional: E esse grafo? 12 11 8 9 10 2 4 7 13 1 5 3 6 14 (e) G 1
Problema 1: Número de Erdõs Paul Erdõs: famoso matemático hungáro; Trabalhou com centenas de colaboradores; Publicou mais de 1.400 artigos; Número de Erdõs é um tributo divertido criado pelos amigos; Paul Erdõs tem número de Erdõs 0; Os colaboradores diretos tem número 1; Os colaboradores dos colaboradores tem número 2 e assim por diante;
Definição Dada uma lista de pessoas e as relações de colaboração entre elas, qual é o número de Erdõs de cada pessoa?
Definição Dada uma lista de pessoas e as relações de colaboração entre elas, qual é o número de Erdõs de cada pessoa? Este problema pode ser modelado através de um grafo: As pessoas são os vértices; As relações de colaboração são as arestas.
Exemplo Murty Bondy White Chvatal Harary Lovasz 0 Erdos Babai Hell Deng Imrich Papadi mitriou Watkins Gates
Busca em Largura (BFS - Breadth-First Search) Murty Bondy White Chvatal Harary Lovasz 0 Erdos Babai Hell Deng Imrich Papadi mitriou Watkins Gates
Busca em Largura (BFS - Breadth-First Search) Murty Bondy White Chvatal Harary Lovasz 0 Erdos Babai Hell Deng Imrich Papadi mitriou Watkins Erdos Gates
Busca em Largura (BFS - Breadth-First Search) Murty Bondy White Chvatal1 Harary1 Lovasz1 0 Erdos Babai 1 Imrich Watkins Hell 1 Deng Papadi mitriou Gates Chvatal Lovasz Babai Hell Harary
Busca em Largura (BFS - Breadth-First Search) Murty Bondy 2 White 2 Chvatal1 Harary1 Lovasz1 0 Erdos Babai 1 Imrich2 Watkins2 Hell 1 2 Deng Papadi mitriou Gates Bondy Imrich Watkins Deng White
Busca em Largura (BFS - Breadth-First Search) Murty 3 Bondy 2 White 2 Chvatal1 Harary1 Lovasz1 0 Erdos Babai 1 Imrich2 Watkins2 Hell 1 2 3 Deng Papadi mitriou Gates Murty Papadimitriou
Busca em Largura (BFS - Breadth-First Search) Murty 3 Bondy 2 White 2 Chvatal1 Harary1 Lovasz1 0 Erdos Babai 1 Imrich2 Watkins2 Gates Hell 1 2 3 Deng Papadi mitriou 4 Gates
Busca em Largura (BFS - Breadth-First Search) Murty Bondy White Chvatal Harary Lovasz Erdos Babai Hell Deng Imrich Papadi mitriou Watkins Gates
Algoritmo BFS 1 bfs(g, s): 2 para u em V(G) faça 3 u.visitado = False 4 u.d = 5 u.p = None 6 s.visitado = True 7 s.d = 0 8 Q = Fila() 9 insere(q, s) 10 enquanto tamanho(q) > 0 faça 11 u = remove(q) 12 para v em adj(u) faça 13 se não v.visitado então 14 v.d = u.d + 1 15 v.p = u 16 v.visitado = True 17 insere(q, v)
Algoritmo BFS 1 bfs(g, s): 2 para u em V(G) faça 3 u.visitado = False 4 u.d = 5 u.p = None 6 s.visitado = True 7 s.d = 0 8 Q = Fila() 9 insere(q, s) 10 enquanto tamanho(q) > 0 faça 11 u = remove(q) 12 para v em adj(u) faça 13 se não v.visitado então 14 v.d = u.d + 1 15 v.p = u 16 v.visitado = True 17 insere(q, v) Análise da complexidade:
Algoritmo BFS 1 bfs(g, s): 2 para u em V(G) faça 3 u.visitado = False 4 u.d = 5 u.p = None 6 s.visitado = True 7 s.d = 0 8 Q = Fila() 9 insere(q, s) 10 enquanto tamanho(q) > 0 faça 11 u = remove(q) 12 para v em adj(u) faça 13 se não v.visitado então 14 v.d = u.d + 1 15 v.p = u 16 v.visitado = True 17 insere(q, v) Análise da complexidade: Cada vértice adicionado uma vez na fila (linha 17): O(n)
Algoritmo BFS 1 bfs(g, s): 2 para u em V(G) faça 3 u.visitado = False 4 u.d = 5 u.p = None 6 s.visitado = True 7 s.d = 0 8 Q = Fila() 9 insere(q, s) 10 enquanto tamanho(q) > 0 faça 11 u = remove(q) 12 para v em adj(u) faça 13 se não v.visitado então 14 v.d = u.d + 1 15 v.p = u 16 v.visitado = True 17 insere(q, v) Análise da complexidade: Cada vértice adicionado uma vez na fila (linha 17): O(n) A lista de adjacência de cada vértice percorrida uma vez (linha 12): O(m)
Algoritmo BFS 1 bfs(g, s): 2 para u em V(G) faça 3 u.visitado = False 4 u.d = 5 u.p = None 6 s.visitado = True 7 s.d = 0 8 Q = Fila() 9 insere(q, s) 10 enquanto tamanho(q) > 0 faça 11 u = remove(q) 12 para v em adj(u) faça 13 se não v.visitado então 14 v.d = u.d + 1 15 v.p = u 16 v.visitado = True 17 insere(q, v) Análise da complexidade: Cada vértice adicionado uma vez na fila (linha 17): O(n) A lista de adjacência de cada vértice percorrida uma vez (linha 12): O(m) Complexidade total: O(n+m)
Exercícios 1. Considere G = (V, E), n = V, m = E e grafos não-orientados. Calcule a complexidade no pior caso de: Problema Espaço em memória Buscar vértices adjacentes de um vértice v Conferir adjacência dos vértices u e v Visitar todas as arestas Calcular o grau de um vértice v Matriz Adjacências Lista Adjacências
Bibliografia Utilizada CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L. e STEIN, C. Introduction to Algorithms, 3 a edição, MIT Press, 2009.