MATEMÁTICA DISCRETA PARA ENGENHARIA DE COMPUTAÇÃO Profa. Kathya Collazos Linares *As aulas baseiam-se no material do Professor Antonio Alfredo Ferreira Loureiro
O problema das sete pontes de Königsberg ou O início da teoria dos grafos (1) Leonhard Euler (1707-1783) aos 49 anos. Tela em óleo pintada por Jakob Emanuel Handmann em 1756. Leonhard Euler, matemático suíço. Considerado um dos maiores matemáticos de todos os tempos. Foi um cientista extremamente produtivo contribuindo para muitas áreas da matemática como teoria dos números, análise combinatória e análise, bem como o seu uso em áreas como música e arquitetura naval. Euler foi o primeiro a usar o termo função para descrever uma expressão envolvendo vários argumentos, ou seja, y = F (x). No total escreveu mais de 1100 artigos e livros. Durante os últimos 17 anos de vida, ele ficou praticamente cego, quando produziu quase que metade de seus trabalhos. A área de teoria dos grafos começa em 1736 quando publica um artigo (Solutio problematis ad geometriam situs pertinentis) contendo a solução para o problema das sete pontes de Königsberg, na época uma cidade da Prússia e, atualmente, cidade da Rússia.
O problema das sete pontes de Königsberg ou O início da teoria dos grafos (2) A cidade de Königsberg foi construída numa região onde haviam dois braços do Rio Pregel e uma ilha. Foram construídas sete pontes ligando diferentes partes da cidade, como mostrado na figura: Problema: É possível que uma pessoa faça um percurso na cidade de tal forma que inicie e volte a mesma posição passando por todas as pontes somente uma única vez?
O problema das sete pontes de Königsberg ou Onde é Königsberg (3) Referência: Northern Germany as far as the Bavarian and Austrian Frontiers; Handbook for Travellers by Karl Baedeker. Fifteenth Revised Edition. Leipzig, Karl Baedeker; New York, Charles Scribner s Sons 1910. History: Kaliningrad was formerly the Prussian port of Königsberg, capital of East Prussia. It was captured by the Red Army in April 1945 and ceded to the Soviet Union at the Potsdam conference. It was renamed in honor of senior Soviet leader Mikhail Kalinin, although he never actually visited the area. Mapa parcial (recente) da cidade.
O problema das sete pontes de Königsberg (4) Euler resolveu este problema dando início à teoria dos grafos. Modelagem proposta por Euler: Todos os pontos de uma dada área de terra podem ser representados por um único ponto já que uma pessoa pode andar de um lado para o outro sem atravessar uma ponte. Um ponto é conectado a outro se houver uma ponte de um lado para o outro. Graficamente, Euler representou o problema como: A B C D
O problema das sete pontes de Königsberg (5) Problema a ser resolvido: É possível achar um caminho que comece e termine num vértice qualquer (A, B, C, ou D) e passe por cada aresta, exatamente, e uma única vez?, ou ainda, É possível desenhar este grafo que comece e termine na mesma posição sem levantar o lápis do papel? A B C D
O problema das sete pontes de Königsberg (6) Aparentemente não existe solução! Partindo do vértice A, toda vez que se passa por qualquer outro vértice, duas arestas são usadas: a de chegada e a de saída. Assim, se for possível achar uma rota que usa todas as arestas do grafo e começa e termina em A, então o número total de chegadas e saídas de cada vértice deve ser um valor múltiplo de 2. B A C No entanto, temos: grau(a) = grau(c) = grau(d) = 3; e grau(b) = 5. D Assim, por este raciocínio informal não é possível ter uma solução para este problema.
Caminhamentos em grafos Caminho (1) Seja G um grafo não dirigido, n 1, e v e w vértices de G. Caminho (walk): Um caminho de v para w é uma sequência alternada de vértices e arestas adjacentes de G. Um caminho tem a forma: ou ainda (v =)v 0 e 1 v 1 e 2 v 2... v n 1 e n v n (= w) onde v 0 = v e v n = w. v 0 [v 0, v 1 ]v 1 [v 1, v 2 ]v 2... v n 1 [v n 1, v n ]v n v 2 e v 1 3 Um possível caminho entre v 1 e v 4 : v 1 e 6 v 3 e 2 v 4 e 7 v 2 e 1 v 3 e 2 v 4 e 3 v 1 e 4 v 2 e 5 v 4 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2
Caminhamentos em grafos Caminho fechado (1) Caminho fechado (Closed walk): Caminho que começa e termina no mesmo vértice: onde v = w. (v =)v 0 e 1 v 1 e 2 v 3... v n 1 e n v n (= w) v 2 e v 1 3 Um possível caminho fechado é: v 1 e 6 v 3 e 2 v 4 e 7 v 2 e 1 v 3 e 2 v 4 e 3 v 1 e 4 v 2 e 5 v 4 e 3 v 1 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2
Caminhamentos em grafos Trajeto Trajeto (Path): Caminho de v para w sem arestas repetidas: (v =)v 0 e 1 v 1 e 2 v 3... v n 1 e n v n (= w) onde todas as arestas e i são distintas, ou seja, e i e k, para qualquer i k. v 2 e v 1 3 Um possível trajeto é: v 1 e 6 v 3 e 2 v 4 e 7 v 2 e 1 v 3 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2
Caminhamentos em grafos Trajeto simples Trajeto simples (Simple path): Caminho de v para w sem arestas e vértices repetidos. v 2 e v 1 3 Um possível trajeto simples é: v 1 e 6 v 3 e 2 v 4 e 7 v 2 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2
Caminhamentos em grafos Circuito Circuito (Circuit): Trajeto fechado, ou seja, um caminho onde não há aresta repetida e os vértices inicial e final são idênticos: (v =)v 0 e 1 v 1 e 2 v 3... v n 1 e n v n (= w) onde toda aresta e i, 1 i n, é distinta e v 0 = v n. v 2 e v 1 3 Um possível circuito é: v 1 e 6 v 3 e 2 v 4 e 7 v 2 e 1 v 3 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2
Caminhamentos em grafos Circuito simples Circuito simples (Simple circuit): Trajeto fechado, ou seja, um caminho onde não há arestas e vértices repetidos, exceto os vértices inicial e final que são idênticos. v 2 e v 1 3 Um possível circuito simples é: v 1 e 6 v 3 e 2 v 4 e 7 v 2 e 4 v 1 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2 Um circuito simples também é chamado de ciclo simples.
Terminologia de caminhamentos Aresta Vértice Começa e termina Tipo repetida? repetido? no mesmo vértice? Caminho (walk) Pode Pode Pode Caminho fechado (closed walk) Pode Pode Sim Trajeto (path) Não Pode Pode Trajeto simples (simple path) Não Não Não Circuito (circuit) Não Pode Sim Circuito simples (simple circuit) Não v 0 = v n Sim
Caminhamentos em grafos Notação simplificada (1) Em geral um caminho pode ser identificado de forma não ambígua através de uma sequência de arestas ou vértices. e 1 2 v1 v2 e v3 3 e e 4 O caminho e 1 e 2 e 4 e 3 representa de forma não ambígua o caminho v 1 e 1 v 2 e 2 v 3 e 4 v 3 e 3 v 2 A notação e 1 é ambígua, se usada para referenciar um caminho, pois pode representar duas possibilidades: v 1 e 1 v 2 ou v 2 e 1 v 1. A notação v 2 v 3 é ambígua, se usada para referenciar um caminho, pois pode representar duas possibilidades: v 2 e 2 v 3 ou v 2 e 3 v 3.
Caminhamentos em grafos Notação simplificada (2) e 2 e1 v1 v2 e 3 v 3 A notação v 1 v 2 v 2 v 3, se for associada a um caminho, representa de forma não ambígua o caminho v 1 e 1 v 2 e 2 v 2 e 3 v 3 Se um grafo G não possui arestas paralelas, então qualquer caminho em G pode ser determinado de forma única por uma sequência de vértices.
Identificando o caminhamento (1) e 4 v 1 e 2 e 1 v 2 e 3 e 8 v 3 e 7 e 5 v 4 e 6 e 10 v e 6 9 v5 Que tipo de caminhamento é? v 1 e 1 v 2 e 3 v 3 e 4 v 3 e 5 v 4 Aresta repetida? Não. Vértice repetido? Sim v 3. Começa e termina no mesmo vértice? Não. Trajeto. e 1 e 3 e 5 e 5 e 6 Aresta repetida? Sim e 5. Vértice repetido? Sim v 3. Começa e termina no mesmo vértice? Não. Caminho.
Identificando o caminhamento (2) e 4 v 1 e 2 e 1 v 2 e 3 e 8 v 3 e 7 e 5 v 4 e 6 e 10 v e 6 9 v5 Que tipo de caminhamento é? v 2 v 3 v 4 v 5 v 3 v 6 v 2 Aresta repetida? Não. Vértice repetido? Sim v 2 e v 3. Começa e termina no mesmo vértice? Sim v 2. Circuito. v 2 v 3 v 4 v 5 v 6 v 2 Aresta repetida? Não. Vértice repetido? Sim v 2. Começa e termina no mesmo vértice? Sim v 2. Circuito simples.
Identificando o caminhamento (3) e 4 v 1 e 2 e 1 v 2 e 3 e 8 v 3 e 7 e 5 v 4 e 6 e 10 v e 6 9 v5 Que tipo de caminhamento é? v 2 v 3 v 4 v 5 v 6 v 3 v 2 Aresta repetida? Sim e 3. Vértice repetido? Sim v 2 e v 3. Começa e termina no mesmo vértice? Sim v 2. Caminho fechado. v 1 Aresta repetida? Não. Vértice repetido? Não. Começa e termina no mesmo vértice? Sim v 1. Caminho (circuito) trivial.
Conectividade (1) Informalmente um grafo é conexo (conectado) se for possível caminhar de qualquer vértice para qualquer outro vértice através de uma sequência de arestas adjacentes. Definição: Seja G um grafo. Dois vértices v e w de G estão conectados sse existe um caminho de v para w. Um grafo G é conexo sse dado um par qualquer de vértice v e w em G, existe um caminho de v para w. Simbolicamente, G é conexo vértices v, w V (G), um caminho de v para w. Se a negação desta afirmação for tomada, é possível ver que um grafo não é conexo sse existem dois vértices em G que não estão conectados por qualquer caminho.
Conectividade (2) v 2 v3 v4 v5 v6 v 1 G 1 Grafo conexo. v2 v4 v 5 v6 v 3 v 4 v 2 v 5 v1 v3 v8 v7 v 1 v 6 G 2 G 3 Grafos não conexos.
Conectividade (3) Lemas Seja G um grafo. (a) Se G é conexo, então quaisquer dois vértices distintos de G podem ser conectados por um trajeto simples (simple path). (b) Se vértices v e w são parte de um circuito de G e uma aresta é removida do circuito, ainda assim existe um trajeto de v para w em G. (c) Se G é conexo e contém um circuito, então uma aresta do circuito pode ser removida sem desconectar G.
Conectividade (4) Os grafos v2 v4 v 5 v6 v 3 v 4 v 2 v 5 v1 v3 v8 v7 v 1 v 6 G 2 G 3 possuem três partes cada um, sendo cada parte um grafo conexo. Um componente conexo de um grafo é um subgrafo conexo de maior tamanho possível.
Componente conexo (1) Definição: Um grafo H é um componente conexo de um grafo G sse: 1. H é um subgrafo de G; 2. H é conexo; 3. Nenhum subgrafo conexo I de G tem H como um subgrafo e I contém vértices ou arestas que não estão em H. Um grafo pode ser visto como a união de seus componentes conexos.
Componente conexo (2) Os componentes conexos do grafo G abaixo são: v3 v4 v 5 v8 e1 e2 v1 v2 e5 e3 v e 6 4 v7 G possui três componentes conexos: H 1 : V 1 = {v 1, v 2, v 3 } E 1 = {e 1, e 2 } H 2 : V 2 = {v 4 } E 2 = H 3 : V 3 = {v 5, v 6, v 7, v 8 } E 3 = {e 3, e 4, e 5 }
Componente fortemente conexo (conectado) Um grafo dirigido G = (V, E) é fortemente conexo se cada dois vértices quaisquer são alcançáveis a partir um do outro. Os componentes fortemente conexos de um grafo dirigido são conjuntos de vértices sob a relação são mutuamente alcançáveis. Um grafo dirigido fortemente conexo tem apenas um componente fortemente conexo. v3 v0 v 4 Os componentes fortemente conexos do grafo ao lado são: H 1 : V 1 = {v 0, v 1, v 2, v 3 } H 2 : V 2 = {v 4 } H 3 : V 3 = {v 5 } Observe que {v 4, v 5 } não é um componente fortemente conexo já que o vértice v 5 não é alcançável a partir do vértice v 2 v 1 v 5 v 4.
Circuito Euleriano (1) Definição: Seja G um grafo. Um circuito Euleriano é um circuito que contém cada vértice e cada aresta de G. É uma sequência de vértices e arestas adjacentes que começa e termina no mesmo vértice de G, passando pelo menos uma vez por cada vértice e exatamente uma única vez por cada aresta de G.
Circuito Euleriano (2) Teorema: Se um grafo possui um circuito Euleriano, então cada vértice do grafo tem grau par. Prova: Suponha que G é um grafo que tem um circuito Euleriano. [Deve-se mostrar que qualquer vértice v de G tem grau par.] Seja v um vértice particular de G mas escolhido aleatoriamente. O circuito Euleriano possui cada aresta de G incluindo todas as arestas incidentes a v. Vamos imaginar um caminho que começa no meio de uma das arestas adjacentes ao início do circuito Euleriano e continua ao longo deste circuito e termina no mesmo ponto.
Circuito Euleriano (3) Par de arestas entrada/saída Comece aqui v 1 v 3 v 0 v 2 v 5 Par de arestas entrada/saída v 4 Prova (continuação): Cada vez que o vértice v é visitado através de uma aresta de entrada, este vértice é deixado já que o caminho termina no meio de uma aresta. Já que cada circuito Euleriano passa em cada aresta de G exatamente uma única vez, cada aresta incidente a v é visitada uma única vez neste processo. Como o caminho que passa por v é feito através de arestas incidentes a v na forma de pares entrada/saída, o grau de v deve ser múltiplo de 2. Isto significa que o grau de v é par. [O que devia ser mostrado.]
Circuito Euleriano (4) O contrapositivo deste teorema (que é logicamente equivalente ao teorema original) é: Teorema: Se algum vértice de um grafo tem grau ímpar, então o grafo não tem um circuito Euleriano. Esta versão do teorema é útil para mostrar que um grafo não possui um circuito Euleriano. v 2 e v 1 3 e 7 e 4 e 6 e 5 v e v 1 3 4 e 2 Vértices v 1 e v 3 possuem grau 3 e, assim, não possuem um circuito Euleriano.
Circuito Euleriano (5) Revisitando o problema das sete pontes da cidade de Königsberg. A B C D Problema: É possível que uma pessoa faça um percurso na cidade de tal forma que inicie e volte a mesma posição passando por todas as pontes somente uma única vez? Não. Todos os vértices têm grau ímpar.
Circuito Euleriano (6) No entanto, se cada vértice de um grafo tem grau par, então o grafo tem um circuito Euleriano? Não. Por exemplo, no grafo abaixo todos os vértices têm grau par, mas como o grafo não é conexo, não possui um circuito Euleriano. e 1 v 2 e 3 v 3 v 1 e 2 v 4 e 4
Circuito Euleriano (7) Teorema: Se cada vértice de um grafo não vazio tem grau par e o grafo é conexo, então o grafo tem um circuito Euleriano. Prova: [Esta é uma prova construtivista, ou seja, apresenta um algoritmo para achar um circuito Euleriano para um grafo conexo no qual cada vértice tem grau par.] Suponha que G é um grafo conexo não vazio e que cada vértice de G tem grau par. [Deve-se achar um circuito Euleriano para G.] Construa um circuito C usando o algoritmo descrito a seguir. PASSO 1: Escolha qualquer vértice v de G. [Este passo pode ser executado já que pela suposição o conjunto de vértices de G é não vazio.]
Circuito Euleriano (19) Teorema: Um grafo G tem um circuito Euleriano sse G é conexo e cada vértice de G tem grau par. Definição: Seja G um grafo e seja v e w dois vértices de G. Um Trajeto Euleriano de v para w é uma sequência de arestas e vértices adjacentes que começa em v, termina em w e passa por cada vértice de G pelo menos uma vez e passa por cada aresta de G exatamente uma única vez. Corolário: Seja G um grafo e dois vértices v e w de G. Existe um trajeto Euleriano de v para w sse G é conexo e v e w têm grau ímpar e todos os outros vértices de G têm grau par.
Trajeto Euleriano (1) Uma casa possui uma divisão representada pela planta abaixo. É possível uma pessoa sair do cômodo A, terminar no cômodo B e passar por todas as portas da casa exatamente uma única vez? Se sim, apresente um possível trajeto. A G F H I B E C D J K
Trajeto Euleriano (2) A planta da casa pode ser representada pelo grafo abaixo: J I E K H F G D C B A H F G D C B A J I E K Cada vértice deste grafo tem um grau par, exceto os vértices A e B que têm grau 1. Assim, pelo corolário anterior, existe um trajeto Euleriano de A para B. AGHFEIHEKJDCB
Circuito Hamiltoniano (1) Em 1859, propôs um jogo na forma de um dodecaedro (sólido de 12 faces). William Hamilton (1805 1865), matemático irlandês. Contribuiu para o desenvolvimento da óptica, dinâmica e álgebra. Em particular, descobriu a álgebra dos quaternions. Seu trabalho provou ser significante para o desenvolvimento da mecânica quântica.
Circuito Hamiltoniano (2) Jogo proposto por Hamilton Cada vértice recebeu o nome de uma cidade: Londres, Paris, Hong Kong, New York, etc. O problema era: É possível começar em uma cidade e visitar todas as outras cidades exatamente uma única vez e retornar à cidade de partida? O jogo é mais fácil de ser imaginado projetando o dodecaedro no plano:
Circuito Hamiltoniano (3) Jogo proposto por Hamilton Uma possível solução para este grafo é: Definição: Dado um grafo G, um Circuito Hamiltoniano para G é um circuito simples que inclui cada vértice de G, ou seja, uma sequência de vértices adjacentes e arestas distintas tal que cada vértice de G aparece exatamente uma única vez.
Comentários sobre circuitos Euleriano e Hamiltoniano (1) Circuito Euleriano: Inclui todas as arestas uma única vez. Inclui todos os vértices, mas que podem ser repetidos, ou seja, pode não gerar um circuito Hamiltoniano. Circuito Hamiltoniano: Inclui todas os vértices uma única vez (exceto o inicial = final). Pode não incluir todas as arestas, ou seja, pode não gerar um circuito Euleriano.
Comentários sobre circuitos Euleriano e Hamiltoniano (2) É possível determinar a priori se um grafo G possui um circuito Euleriano. Não existe um teorema que indique se um grafo possui um circuito Hamiltoniano nem se conhece um algoritmo eficiente (polinomial) para achar um circuito Hamiltoniano. No entanto, existe uma técnica simples que pode ser usada em muitos casos para mostrar que um grafo não possui um circuito Hamiltoniano.
Determinando se um grafo não possui um circuito Hamiltoniano (1) Suponha que um grafo G tenha um circuito Hamiltoniano C dado por: C : v 0 e 1 v 1 e 2... v n 1 e n v n Como C é um circuito simples, todas as arestas e i são distintas e todos os vértices são distintos, exceto v 0 = v n. Seja H um subgrafo de G que é formado pelos vértices e arestas de C, como mostrado na figura abaixo (H é o subgrafo com as linhas grossas).
Determinando se um grafo não possui um circuito Hamiltoniano (2) Se um grafo G tem um circuito Hamiltoniano então G tem um subgrafo H com as seguintes propriedades: 1. H contém cada vértice de G; 2. H é conexo; 3. H tem o mesmo número de arestas e de vértices; 4. Cada vértice de H tem grau 2. Contrapositivo desta afirmação: Se um grafo G não tem um subgrafo H com propriedades (1) (4) então G não possui um circuito Hamiltoniano.
Determinando se um grafo não possui um circuito Hamiltoniano (3) Prove que o grafo G abaixo não tem um circuito Hamiltoniano. a e b c d Se G tem um circuito Hamiltoniano, então G tem um subgrafo H que: 1. H contém cada vértice de G; 2. H é conexo; 3. H tem o mesmo número de arestas e de vértices; 4. Cada vértice de H tem grau 2.
Determinando se um grafo não possui um circuito Hamiltoniano (4) a e b c d Em G, grau(b) = 4 e cada vértice de H tem grau 2; Duas arestas incidentes a b devem ser removidas de G para criar H; Qualquer aresta incidente a b que seja removida fará com que os outros vértices restantes tenham grau menor que 2; Conseqüentemente, não existe um subgrafo H com as quatro propriedades acima e, assim, G não possui um circuito Hamiltoniano.
O Problema do Caixeiro Viajante (1) Em inglês, Traveling Salesman Problem, ou TSP. Suponha o mapa abaixo mostrando quatro cidades (A, B, C, D) e as distâncias em km entre elas. B 30 C A 30 50 35 40 25 D Um caixeiro viajante deve percorrer um circuito Hamiltoniano, ou seja, visitar cada cidade exatamente uma única vez e voltar a cidade inicial. Que rota deve ser escolhida para minimizar o total da distância percorrida?
O Problema do Caixeiro Viajante (2) Possível solução: Enumere todos os possíveis circuitos Hamiltonianos começando e terminando em A; Calcule a distância de cada um deles; Determine o menor deles. Rota Distância (km) ABCDA 30 + 30 + 25 + 40 = 125 30 B 30 C 25 ABDCA 30 + 35 + 25 + 50 = 140 ACBDA 50 + 30 + 35 + 40 = 155 ACDBA 50 + 25 + 35 + 30 = 140 A 50 35 40 D ADBCA 40 + 35 + 30 + 50 = 155 ADCBA 40 + 25 + 30 + 30 = 125 Assim, tanto a rota ABCDA ou ADCBA tem uma distância total de 125 km.
O Problema do Caixeiro Viajante (3) A solução do TSP é um circuito Hamiltoniano que minimiza a distância total percorrida para um grafo valorado arbitrário G com n vértices, onde uma distância é atribuída a cada aresta. Algoritmo para resolver o TSP: Atualmente, força bruta, como feito no exemplo anterior. Problema da classe NP-Completo. Exemplo: para o grafo K 30 existem 29! 8, 84 10 30 circuitos Hamiltonianos diferentes começando e terminando num determinado vértice. Mesmo se cada circuito puder ser achado e calculado em apenas 1µs, seria necessário aproximadamente 2, 8 10 17 anos para terminar a computação nesse computador.