Prévia do material em texto
Teoria dos Grafos: Problemas Anderson Monte1 André F. Riker1 Thales Madeira1 1Programa de Pós-Graduação em Ciência da Computação Universidade Federal do Pará (UFPA) Belém – PA – Brasil andersonxef@gmail.com, and_rik@hotmail.com, thales.bcc@gmail.com 1. Polígono 1.1. Identificação dos vértices e arestas: O problema do polígono envolve os próprios grafos. Portanto, neste caso, não cabe falar de algo que precisa ser representado através de um grafo, e sim de algo que o grafo envolvido representa. Neste problema, é possível ver um grafo como um conjunto de operadores de adição e multiplicação (“+” e “*”, repsectivamente), representados pelas arestas, e de operandos, representados pelos vértices. As combinações entre os vértices e as arestas geram operações matemáticas que, aos poucos, vão criando uma expressão algébrica. Tal expressão, dado um mesmo grafo, pode variar, dependendo de como as combinações entre os vértices e arestas são realizadas. Baseado neste contexto, a solução do problema consiste em, basicamente, encontrar uma expressão algébrica, utilizando os operandos e operadores dados pelo grafo envolvido, cujo resultado é o maior número possível. Além disso, a solução encontrada também deve informar quais arestas devem ser consideradas por primeiro, na resolução do problema, para que resultado máximo possa ser obtido. 1.2. Solução do problema: No problema do polígono, para criar uma expressão algébrica e descobrir o seu respectivo resultado, é necessário, primeiramente, remover uma das arestas, pois o número de arestas (operadores) e de vértices (operandos) é N, mas apenas N-1 operadores são necessários para formar uma expressão. Após este passo, os próximos são realizados da seguinte forma, até que o resultado final seja obtido: Escolher uma aresta E e dois vértices V1 e V2 que são ligados por E; Substituir E, V1 e V2 por um novo vértice, rotulado com o valor resultante da operação indicada por E sobre os valores V1 e V2. As arestas e vértices de um grafo envolvido no problema do polígono representam três tipos de elementos: números inteiros (operandos), operadores de adição e operadores de multiplicação. Para solucionar tal problema, ou seja, para encontrar uma expressão algébrica que resulte no maior número possível, é necessário implementar um algoritmo que cria expressões de tal modo que, nesta última, as operações de adição geralmente envolvam números pequenos, enquanto que as operações de multiplicação deve envolver os maiores números possíveis. Entretanto, os operandos negativos devem receber uma atenção especial, pois é preciso fazer com que os resultados das operações com os mesmos resultem em números cada vez menores o mínimo possível. Em outras palavras, o algoritmo para solucionar o problema deve seguir as seguintes recomendações: Para cada vértice com operando negativo no grafo e arestas incidentes na mesma contendo operadores de multiplicação, deve-se efetuar as multiplicações até que os resultados parciais se tornem números positivos ou nulos (ou seja, iguais a zero), ou até que os vértices contendo os resultados parciais sejam incididos apenas por arestas contendo operadores de adição. As operações de adição que envolver números negativos devem ser efetuadas por último. As operações de adição que envolver apenas números positivos devem ser efetuadas antes das operações de multiplicação que também envolvem apenas tais tipos de números. O algoritmo deve ser executado tantas vezes quanto o número de arestas existentes no grafo, de modo que, a cada execução, uma aresta diferente seja excluída no primeiro passo. Os resultados das execuções, juntamente com as arestas excluídas no primeiro passo, devem ser armazenados para posterior comparação. As execuções que atingirem o resultado máximo terão suas arestas iniciais inclusas no conjunto de arestas que, se removidas na primeira jogada, podem levar à pontuação máxima. 1.3. Exemplo de aplicação Considerando o grafo abaixo: O algoritmo, para este grafo, será executado da seguinte maneira: Dados (N=4, “+ -7 + 4 * 2 * 5”) ConjArestas = {1, 2, 3, 4}; Para i=1....n faça { ResultadoAtual = 0; ArestaAtual = ConjArestas[i]; Remover ConjArestas[i]; Enquanto (quantidade de operandos negativos > 0) ou (operadores de multiplicação incidentes em operadores negativos > 0) faça ResultadoAtual = ResultadoAtual + Efetuar operações de multiplicação com os operandos negativos; Enquanto (operadores de adição em números positivos > 0) ResultadoAtual = ResultadoAtual + Efetuar operações de adição em operandos positivos; Enquanto (operadores de multiplicação em números positivos > 0) ResultadoAtual = ResultadoAtual + Efetuar operações de multiplicação em operandos positivos; ResultadoAtual = ResultadoAtual + Efetuar operações de adição envolvendo operandos negativos; MaiorResultado = 0; Se (MaiorResultado < ResultadoAtual) { MaiorResultado = ResultadoAtual; ConjArestasMaiorRes = ArestaAtual; } Se (MaiorResultado == ResultadoAtual) { MaiorResultado = ResultadoAtual; ConjArestasMaiorRes = ConjArestasMaiorRes + ArestaAtual; } } Este algoritmo irá retornar os seguintes resultados para o referido grafo: Removendo a Aresta 1: 5 * 2 * 4 + (-7) = 33; Removendo a Aresta 2: 4 * 2 * 5 + (-7) = 33; Removendo a Aresta 3: 2 * 5 + (-7) + 4 = 7; Removendo a Aresta 4: 2 * 4 + (-7) + 5 = 6; Portanto, a solução para este problema, retornada pelo algoritmo, indica que o resultado máximo possível é 33 e que a remoção das arestas 1 e 2, na primeira jogada, podem levar a este resultado. 2. Problema das Pontes de Königsberg 2.1. Representação do grafo Vértices: cidades A, B, C, D. Arestas: pontes a(A,B), b(A,B), c(A,C), d(A,C), e(A,D), f(B,D), g(C,D). 2.2. Técnica utilizada As cidades são representadas pelos vértices e as pontes são arestas, pois representam as ligações entre as cidades (vértices). O problema consiste em afirmar se existe um caminho que passe por todas as pontes (arestas) uma única vez. A resolução consiste em desenhar um grafo que represente as cidades e as pontes e verificar a existência de um caminho euleriano. Se houver um caminho euleriano entre as arestas, então haverá um caminho entre as pontes. Segundo o teorema: Um grafo contem um caminho euleriano, se e somente se, tiver 2 vértices de grau ímpar. 2.3. Solução Vértice A: grau 5, arestas incidentes: a,b,c,d; Vértice B: grau 3, arestas incidentes: a,b,f; Vértice C: grau 3, arestas incidentes: c,d,e; Vértice D: grau 3, arestas incidentes: e,f,g; Como todos os 4 vértices tem grau ímpar, logo, não existe uma maneira de cruzar as pontes de Königsberg passando por todas as pontes uma única vez. 3. Problema do caixeiro viajante 3.1. Breve descrição do problema Em uma cidade conectadas por rodovias, um caixeiro viajante quer visitar pessoalmente cada cidade de modo que ele passe por todas as cidades somente uma vez até voltar ao ponto de partida. 3.2. Representação do grafo No caso do problema do caixeiro viajante, as arestas são as rodovias e os vértices são as cidades. Desse modo, um exemplo de uma cidade utilizando esta representação é apresentada na Figura 1. Figura 1. Exemplo de representação. 3.3. Técnica utilizada A técnica utilizada para resolver este problema é encontrar um ciclo hamiltoniano no grafo. Caso haja um ciclo hamiltoniado então o problema está solucionado, caso não seja possível encontrar um ciclo hamiltoniano então o problema não pode ser solucionado. Um grafo é dito ser hamiltoniano se existe um ciclo que contenha todos os seus vértices, sendo que cada vértice só aparece uma vez no ciclo, com exceção do primeiro. 3.4.Exemplo da técnica utilizada Na Figura 1 há um ciclo hamiltoniano V={PA, AP, MA, TO, MT, AM, RO, PA}. Não existe ainda um método conveniente para determinar se um grafo é Hamiltoniano. Os teoremas existentes são específicos para determinados tipos de grafos, por exemplo: Teorema: Se G é um grafo de n >=3 vértices, tal que o grau(v) >= n/2 para todos os vértice v de G, então G é hamiltoniano. Neste problema, este teorema se aplicaria assim: “Existe um ciclo hamiltoniano se o número de rotas em cada cidade seja maior ou igual ao número de cidades dividido por 2” Esta é uma condição suficiente, porém não necessário. Isto significa que nem todos os grafos hamiltonianos satisfazem esta condição, porém todos os grafos que satisfazem esta condição são hamiltonianos. 4. Problema do Desenho da Casa 4.1. Identificação dos vértices e arestas: Neste problema, todas as linhas que formam a casa são arestas, enquanto que as bolinhas vermelhas são consideradas os vértices do grafo. 4.2. Solução do problema: O desenho da casa, representado pelo grafo acima, pode ser feito do modo como a criança relatou, ou seja, colocando o lápis em uma das bolinhas e realizando movimentos contínuos para traçar cada linha uma única vez, até que o desenho esteja completo. Isto é possível porque o grafo que representa o desenho da casa é conexo e possui exatamente dois vértices de grau ímpar, ou seja, ele é atravessável e possui trilhas eulerianas, que por sua vez é um tipo de trilha que começa em um dos vértices de grau ímpar e termina no outro vértice, passando por todas as arestas apenas uma vez. 4.3. Exemplo de aplicação: Consideram-se os rótulos a seguir, dados para os vértices do grafo em questão: Com base nesta rotulação, uma forma de desenhar esta casa do modo como a criança relatou é seguir a trilha (6, 5, 4, 3, 2, 1, 3, 6, 4, 2, 5). A trilha mencionada começa em um vértice de grau ímpar, passa por todas as arestas do grafo apenas uma vez, e termina no outro vértice que também possui grau ímpar, portanto tal trilha é euleriana e resolve o problema adequadamente. 5. O Problema do Assassinato do Bilionário Count Van Diamond 5.1. Representação do grafo Vértices: são os cômodos da casa. Sala de jogos (A), quarto de hospedes (B), bar (C), dormitório (D), dependência da empregada (E), sala da piscina (F), adega (G), cozinha (H), despensa (I), e fora da casa(J), pois ainda existem duas portas que levam para fora da residência, devendo este ser considerado também um vértice. Arestas: portas entre os cômodos: porta entre sala de jogos e quarto de hospedes 1(A,B), e em seguida, 2(A,B), 3(B,F), 4(B,C), 5(C,D), 6(D,E), 7(D,E), 8(G,H), 9(G,H), 10(F,H), 11(H,I), 12(F,I), 13(F,J), 14(F,J). 5.2. Técnica utilizada O problema se baseia em provar quem tem razão: o mordomo ou o jardineiro. E a prova gira em torno das portas já que o jardineiro afirma que passou por todas sem repetir uma porta e o mordomo afirma que ele repetiu uma das portas da piscina. No problema cada cômodo foi considerado um vértice e o lado de fora da casa também, pois existem portas entre a piscina e o lado de fora e as portas são as arestas que ligam cada cômodo. O problema consiste em afirmar se existe um caminho que passe por todas as portas (arestas) uma única vez, provando que o jardineiro diz a verdade, e o mordomo mente. Caso contrário o mentiroso é o jardineiro. A resolução consiste em desenhar um grafo que represente os cômodos e as portas e verificar a existência de um caminho euleriano. Se houver um caminho euleriano entre as arestas, então haverá um caminho entre as pontes, o que prova que o mordomo mente, caso contrário, o mentiroso será o jardineiro, pois não existirá uma maneira de passar por todas as portas, passando uma única vez por cada uma. Segundo o teorema: Um grafo contem um caminho euleriano, se e somente se, tiver 2 vértices de grau ímpar. 5.3. Solução Vértice A: grau 2, arestas incidentes(1,2); Vértice B: grau 4, arestas incidentes(1,2,3,4); Vértice C: grau 2, arestas incidentes(4,5); Vértice D: grau 3, arestas incidentes(5,6,7); Vértice E: grau 2, arestas incidentes(6,7); Vértice F: grau 5, arestas incidentes(3,10,12,13,14); Vértice G: grau 2, arestas incidentes(8,9); Vértice H: grau 4, arestas incidentes(8,9,10,11); Vértice I: grau 2, arestas incidentes(11,12); Vértice J: grau 2, arestas incidentes(13,14); Como existem exatamente dois vértices de grau ímpar (D=dormitório e F=piscina), então existe um caminho euleriano, logo, existe uma maneira de passar por todas as portas passando por cada uma delas uma única vez, o que confirma a versão do jardineiro e prova que o mordomo está mentindo. O mordomo é o assassino. 6. O Problema do passeio do cavalo (xadrez) 6.1. Breve descrição do problema Um cavalo que possui movimentos em “L” no xadrez, pode partir de uma casa qualquer, percorrer todas as casas somente uma vez e retornar à casa inicial? 6.2. Representação do grafo No problema do passeio do cavalo as casas do tabuleiro são os vértices e os possíveis movimentos do cavalo são as arestas. Figura 2. Representação dos movimentos do cavalo no tabuleiro de xadrez. 6.3. Técnica utilizada A técnica utilizada para resolver este problema é verificar se o grafo gerado é hamiltoniano. A Figura 2 apresenta que o grafo completo possuirá 64 vértices e 168 arestas, e como apresentado na Figura 1 existem vários ciclos sendo formados. 7. Problema da Pavimentação de Estradas 7.1. Identificação dos vértices e arestas: A rede de estradas envolvida no problema é representada pela matriz de adjacência abaixo: Através desta matriz de adjacência, também é possível representar a rede de estradas através de um grafo onde os vértices são as cidades ligadas pela rede de estradas (na matriz de adjacência, cada cidade é representada por um número, sendo a cidade de Santana do Caixa Prego representada pelo número 1) e as arestas são as estradas que ligam tais cidades (representadas, na matriz de adjacência, pelas posições assinaladas com um “X”, indicando que existe uma estrada entre duas determinadas cidades). 7.2. Solução do problema: Segundo Tertuliano Gonçalves, o trabalho de pavimentação deve começar em Santana e prosseguir em continuidade, estada após estrada, terminando na mesma cidade onde o trabalho foi iniciado. Para que isso seja possível, é necessário que exista, no grafo que representa a rede de estradas a ser pavimentada, um ciclo euleriano. O ciclo euleriano de um grafo é aquele que começa em um vértice, passa por todas as arestas apenas uma vez, e termina no mesmo vértice onde começou. O referido tipo de ciclo só poderá existir em um grafo se este último for conexo e todos os seus vértices possuírem grau par. 7.3. Exemplo de aplicação: Através da matriz de adjacência mostrada anteriormente, é possível saber o grau de um determinado vértice através da quantidade de adjacências que podem ser contadas em sua respectiva linha ou coluna. O vértice 2, por exemplo, possui na sua linha e na sua coluna quatro adjacências com diferentes vértices, portanto o seu grau é 4. Baseado nas informações contidas na matriz de adjacência, é possível constatar que o grafo que representa a rede de estradas a ser pavimentada não possui um ciclo euleriano, pois os vértices 1, 8, 9 e 10 possuem grau ímpar. Logo, não é possível realizar o trabalho de pavimentação do modo como foi planejado e o Tertuliano não estava sendo sincero com a Josefina. Ainda que o itinerário 1-5-9-10 estivesse a cargo de outra empresa, o trabalho não poderia ser concluído do modo planejado e o Tertuliano ainda não estaria sendo sincero, pois a eliminação deste itinerário dos planos da primeiraempresa iria, também, eliminar algumas adjacências dos vértices que compõem o itinerário, de modo que os vértices 1 e 10 passariam a ter grau par, porém os vértices 8 e 9 ainda iriam possuir grau ímpar, o que impossibilita a existência de ciclos eularianos no grafo. 8. O problema da Coleta de Correspondências 8.1. Representação do grafo Vértices: postos de coletas de correspondência. Arestas: rotas entre os postos. 8.2. Técnica utilizada O problema se baseia em encontrar uma maneira eficiente de fazer a coleta de correspondência entre os postos do correio. E responder 3 perguntas básicas do problema: Como modelar o problema?, Como encontrar a melhor rota? Que particularidades devem ser tratadas? O problema consiste em encontrar um caminho que passe por todos os postos de coletas (vértices) uma única vez, de modo que os motoristas tenham um caminho mais simples para trabalhar. A resolução consiste em desenhar um grafo que represente os postos de coleta e as rotas entre os postos e verificar a existência de um caminho hamiltoniano, ou seja, encontrar a solução mais eficiente seria encontrar um caminho que fizesse os motoristas passarem por cada posto uma única vez sem ter de dar diversas voltas pela cidade. Se houver um caminho hamiltoniano entre as arestas (rotas entre os postos), então este será o caminho mais eficiente para os motoristas. 8.3. Solução O problema deve ser modelado na forma de um grafo onde os postos de coleta serão os vértices e as rotas entre estes postos serão as arestas. A melhor rota será uma rota que represente um caminho hamiltoniano, ou seja, será a rota que passa uma única vez por cada posto de coleta. As particularidades que devem ser tratadas são os caminhos hamiltonianos que podem existir, caso não exista um, o caminho mais eficiente será aquele que chegar próximo ao caminho hamiltoniano. Outra particularidade seria dividir o grafo de todos os postos de coleta em subgrafos que contenham caminhos hamiltonianos assim cada subgrafo ficaria sob a responsabilidade de um motorista garantindo a cada motorista o melhor caminho. 9. O problema do Robô-Café 9.1. Breve descrição do problema Um robô deve distribui cafezinhos em todas os escritórios da empresa, de modo circular. Uma melhoria deve ser feita, de modo que o robô se adapte a qualquer empresa de sorte que o robô escolha o melhor roteiro. Sempre considera-se o mesmo piso. Para isso o robô foi equipado com um sensor que identificava portas e outro que indica pontos de paradas. O robô seria capaz de diferenciar os sensores de portas dos sensores de parada, porém em cada local ele só seria capaz de captar apenas o sinal de dentro da sala. Na escolha do melhor roteiro o robô deve: Passar por todas as salas com sensores; Minimizar a distância percorrida; O ciclo deve ser sempre completado, o que pode-se mudar é a ordem das salas visitadas; 9.2. Representação do grafo O problema se resume basicamente a escolher um percurso cíclico de modo a otimizar a ordem das salas visitadas. Como parâmetro para esta otimização pode-se atribuir pesos a cada aresta, sendo este peso como a combinação entre a distância e a requisição de parada. Para representar este problema como um grafo deve-se considerar cada ponto de parada como vértice e cada porta como aresta. 9.3. Técnica utilizada Como para cada aresta pode ser atribuída pesos que são combinação entre a distância e a requisição, pode-se utilizar o algoritmo de Dijstra para calcular o caminho de custo mínimo. Esta rota daria prioridade aos pontos de paradas mais pertos que estão emitindo sinal de requisição de café. 10. Problema do Caminho de Custo Mínimo 10.1. Identificação dos vértices e arestas: A rede de estradas mostrada no mapa abaixo pode ser representada através de um grafo, onde as arestas representam as estradas que ligam as cidades e os vértices representam as cidades por onde as estradas passam. Cada aresta irá possuir um peso que representa a distância entre as duas cidades ligadas pela respectiva estrada. 10.2. Solução do problema: O caminho de menor custo entre quaisquer duas cidades pode ser calculado através do algoritmo de Dijkstra. Escolhido um vértice do grafo como raiz da busca, este algoritmo calcula o custo mínimo deste vértice para todos os demais vértices do grafo. Este algoritmo parte de uma estimativa inicial para o custo mínimo e vai sucessivamente ajustando esta estimativa. Ele considera que um vértice estará fechado quando já tiver sido obtido um caminho de custo mínimo do vértice tomado como raiz da busca até ele. Caso contrário ele é dito estar aberto. Algoritmo: Seja G(V,A) um grafo orientado e s um vértice de G: 1. Atribua valor zero à estimativa do custo mínimo do vértice s (a raiz da busca) e infinito às demais estimativas; 2. Atribua um valor qualquer aos precedentes (o precedente de um vértice t é o vértice que precede t no caminho de custo mínimo de s para t); 3. Enquanto houver vértice aberto: o seja k um vértice ainda aberto cuja estimativa seja a menor dentre todos os vértices abertos; o feche o vértice k o Para todo vértice j ainda aberto que seja sucessor de k faça: some a estimativa do vértice k com o custo do arco que une k a j; caso esta soma seja melhor que a estimativa anterior para o vértice j, substitua-a e anote k como precedente de j. 10.3. Exemplo de aplicação: O grafo a seguir será utilizado como exemplo: Ao aplicar o algoritmo de Dijkstra no grafo anterior, onde o objetivo é encontrar o caminho de menor custo entre o vértice A e o vértice D, será possível constatar que, apesar de haver um caminho direto entre os dois vértices, o caminho (A, C, D) é o de menor custo dentre todos os possíveis, pois este último possui um custo total de 5, enquanto que o caminho (A, D) possui um custo total 8, e o caminho (A, B, D), também 8. 11. O Problema do Metrô 11.1. Representação do grafo Vértices: cada estação (destino ou partida). Arestas: ligações diretas entre cada estação vizinha. 11.2. Técnica utilizada O problema consiste em encontrar a melhor rota de metrô. No problema o melhor caminho leva em consideração o número de trocas de composição e em seguida o numero de paradas. Logo o melhor caminho será aquele que tiver o menor número de troca de composição e menor número de paradas. Para resolver o problema desenha-se um grafo onde cada estação será um vértice, onde cada estação pode ser uma troca de composição ou parada. 11.3. Solução Para verificar o melhor caminho entre dois vértices (estações) verifica-se todos os caminhos possíveis entre estes vértices. Depois verificar o número vértices que são trocas de composição e armazenar esse valor, e o número de vértices que são paradas e armazenar também. Depois se realiza uma comparação onde o caminho que tiver o menor número de trocas de composição e menor número de paradas nessa ordem será o melhor caminho. Uma particularidade desse problema é que o sistema pode calcular esses resultados uma única vez e armazenar os resultados em um banco, dessa forma quando cada usuário for utilizar o metrô, basta mostrar o resultado já calculado e armazenado para cada combinação de estações (destino e partida). 12. O problema da RNP 12.1. Breve descrição do problema A RNP (Rede Nacional de Pesquisa) é uma rede de computadores que interliga várias instituições. Como selecionar a melhor rota quando for houver mais de uma possibilidade? 12.2. Representação do grafo Cada vértice é um POP (Ponto de Presença) e cada aresta é um enlace 12.3. Técnica utilizada Pode-se atribuir pesos às arestas de modo que quando houver mais de um caminho possível escolher-se aquele com menor peso. Sendo queeste peso pode ser indicando o congestionamento do enlace ou a vazão do enlace. Para calculo computacional da melhor rota pode-se utilizar o algoritmo de Dijkstra, que calcula o caminho de custo mínimo. 13. Problema da Carga Pesada 13.1. Identificação dos vértices e arestas: Este problema pode ser representado através de um grafo onde os vértices representam as cidades e as arestas representam as estradas que ligam tais cidades. Além disso, cada aresta do grafo possui um peso que corresponde à restrição de altura máxima, imposta pelo viaduto existente na estrada representada. 13.2. Solução do problema: Uma vez tendo a representação de tal problema em forma de grafo, para resolvê- lo é necessário encontrar o fluxo máximo do grafo, que se trata do número máximo de unidades de fluxo (que, no caso do problema em questão, representa a altura das cargas) que é possível enviar, através do grafo, desde o nó de origem até o nó de destino. O Algoritmo de Ford-Fulkerson pode ser utilizado para encontrar o fluxo máximo de um grafo: 1. Introduz-se um fluxo arbitrário compatível (fluxo de cada arco não exceda a capacidade). 2. Obtém-se um fluxo completo (todos os caminhos contenham pelo menos um arco saturado) 3. Obtém-se o fluxo máximo a. Marca-se a fonte com sinal + b. Um vértice Xi estando marcado: i. marcar com + Xi todo vértice Xj não marcado tal que existe um arco (Xi,Xj) não saturado. ii. marcar com - Xi todo vértice Xj não marcado tal que exista um arco (Xj,Xi) percorrido por um fluxo não nulo. c. Se o fluxo não for máximo, considera-se a seqüência de vértices marcados (+ ou -) indo da fonte ao sumidouro; se um arco desta seqüência é orientado no sentido da seqüência soma-se, em caso contrário subtrai-se uma unidade ao fluxo desse arco; d. Apaga-se as marcas e retorna-se ao passo 3.a até que não seja possível marcar o sumidouro (passo 3.c). 14. O Problema da Ambulância 14.1. Representação do grafo Vértices: vilas 1,2,3,4,5,6,7. Arestas: igarapés (1,2), (2,6), (3,4), (4,3), (4,5), (5,7), (6,2), (6,4), (6,7), (7,1), (7,4). 14.2. Técnica utilizada O problema consiste em encontrar o menor caminho entre as vilas. A solução baseia-se em representar o problema na forma de um dígrafo onde as vilas são representadas pelos vértices e os igarapés por arestas dirigidas. E o menor caminho entre as vilas será o caminho com o menor número de arestas. 14.3. Solução Para verificar o menor caminho entre dois vértices em um dígrafo, é necessário criar uma lista de todos os caminhos possíveis entre esses dois vértices e em seguida verificar qual deles passa pelo menor número de arestas, pois este será o menor caminho. 15. O problema dos canibais e dos missionários 15.1. Breve descrição do problema Há três missionários e três canibais que devem atravessar um rio em uma canoa que transporta apenas duas pessoas. Como fazer essa atravessia sem que o número de canibais seja superior ao número de missionários 15.2. Representação do grafo Todas as situações possíveis nas margens podem ser representadas por um par ordenado (c,m), onde m representa o número de missionários e c o número de canibais. Assim, são gerados 16 combinações, porém como há restrição para que m>=c restam 10 situações possíveis. Os vértices são os 10 pares ordenados (c,m), que descrevem os possíveis estados das margens; As arestas são os pares ordenados composto pelo vértice da margem antes de iniciar a travessia e pelo vértice da margem oposta após a travessia ser completada. 15.3. Técnica utilizada A solução poderia utilizar um algoritmo de busca que escolhesse estados até chegar ao estado (cc,mm) e de lá retornasse ao estado (ccc,mmm) 16. Problema da Fuga dos Ladrões 16.1. Identificação dos vértices e arestas: Este problema pode ser representado através de um grafo onde os vértices devem representar as situações (ou estados) que podem ocorrer nos locais de origem e de destino da fuga, no que se refere à presença dos ladrões e do dinheiro roubado. Cada um destes estados pode ser representado através de um conjunto (a, b, c, d) de números binários, onde: “a” representa o ladrão que sabe pilotar, cujo peso é 60 Kg; “b” representa o guarda-costas do chefe, que pesa 100 Kg; “c” representa o chefe dos ladrões, que pesa 70 Kg; “d” representa o dinheiro roubado, cujo peso é 40 Kg. O valor 0 para um determinado item significa a ausência daquele elemento em um determinado local, enquanto que o valor 1 significa presença. 16.2. Solução do problema: Para este problema, existem algumas restrições que eliminam algumas situações, pois as mesmas não podem ocorrer: Apenas um ladrão sabe pilotar, portanto ele sempre estará presente no avião e no local onde o mesmo se encontra a cada momento (origem ou destino), durante o processo de fuga (Seu valor será sempre 1 nos estados). O avião comporta apenas 170 Kg. Portanto, se o piloto der carona para o guarda-costas, nada mais poderá ser levado no avião, na mesma viagem (O valor 1 para o piloto e para o guarda-costas implica em valor 0 para os demais elementos). Como existe desconfiança mútua entre o piloto e o chefe, em nenhum momento qualquer um dos dois pode ficar sozinho com o dinheiro. Isto quer dizer que estados onde se nota a presença de apenas um destes dois elementos e do dinheiro, tanto no lado onde o avião se encontra como no lado opsoto, não são permitidos (como (1, 0, 0, 1), (0, 0, 1, 1), (1, 1, 0, 0) e (0, 1, 1, 0)). Nos dois últimos conjuntos, a ausência de um dos ladrões em questão e do dinheiro significa a presença dos mesmos no outro lado. O grafo abaixo apresenta alguns estados possíveis (representados pelos vértices) e transições entre os mesmos (representados pelas arestas). A solução para o problema em questão é encontrar um caminho que parta do vértice (1, 1, 1, 1), onde todos os ladrões e o dinheiro se encontram na origem da rota de fuga, e chegue novamente ao mesmo vértice, indicando que todos os elementos se encontram no destino da rota. 17. O Problema dos três maridos ciumentos 17.1. Representação do grafo Vértices: maridos e esposas: M1,E1,M2,E2,M3,E3. Arestas: pessoas que não podem estar juntas no carro, nem no local de partida e nem no local destino: (M1,E2), (M1,E3), (M2,E1), (M2,E3), (M3,E1), (M3,E2). 17.2. Técnica utilizada O problema consiste em levar 3 casais a um lugar em um carro onde só cabem duas pessoas e um marido não pode estar sozinho com a esposa do outro. Pode-se descrever este problema na forma de um grafo principal P(V,A) onde os vértices são os maridos e esposas e as arestas são as pessoas que não podem estar juntas nos carros, ou seja, um marido e a mulher dos outros. A solução baseia-se em formar 3 grafos completos, um representando a dupla no carro, um representando as pessoas no local de partida e um representando as pessoas no local de destino. E a cada passo da resolução cada um desses 3 grafos não pode ser igual (mesmas arestas entre os mesmos vértices) a nenhum subgrafo do grafo principal P, ou seja, nenhum desses grafos pode ter a mesma ligação de uma das arestas do grafo principal, pois representam duplas que não podem estar sozinhas. 17.3. Solução Na saída: M1,E1,M2,E2,M3,E3. No destino: ninguém. No carro: M1 vai com E1, M1 volta só. Na partida: M1,M2,E2,M3,E3. No destino: E1. No carro: M1 vai com M2, M2 volta só. Na partida: M2,E2,M3,E3. No destino: M1,E1. No carro: M2 vai com M3, E1 volta só. Na partida: E1,E2,E3. No destino: M1,M2,M3. No carro: E1 vai com E2, M3 volta só. Na partida: M3,E3. No destino: M1,E1,M2,E2. No carro: M3 vai com E3. Na partida: ninguém. No destino: M1,E1,M2,E2,M3,E3. 18. O problema dos potes de vinho 18.1. Breve descriçãodo problema Existem três potes v1, v2, v3 de vinho com capacidades de 8, 5 e 3 litros, respectivamente. O maior está cheio e os outros estão vazios. Deve-se dividir os 8 litros de vinho em duas partes de 4 litros. Para realizar isso, qual seria o menor número de transvasos possível para completar a tarefa? 18.2. Representação do grafo Os vértices podem ser representados como sendo trio ordenado (q, q2, q3), representando a quantidade de vinho dos vasos v1, v2, v3. As arestas são representadas pelos pares ordenados (e1, e2), onde e1 representa o estado inicial de um vaso, e e2 representa um estado final que foi alcançado por meio de um único transvaso de um pote no outro. 18.3. Técnica utilizada Para encontrar a solução deve-se gerar o grafo contento todos os estados que satisfazem as condição. Depois de gerar tal grafo será possível executar um algoritmo de caminho de custo mínimo (Dijstra) que vá do estado (8,0,0) até (4,4,0). 19. Problema do Concerto com o U2 19.1. Identificação dos vértices e arestas: Este problema pode ser representado através de um grafo onde os vértices devem representar as situações (ou estados) que podem ocorrer nos locais de origem e de destino da travessia da ponte, no que se refere à presença dos músicos. Cada um destes estados pode ser representado através de um conjunto (b, e, a, l) de números binários, onde: “b” representa o Bono, que cruza a ponte em 1 minuto; “e” representa o Edge, que cruza a ponte em 2 minutos; “a” representa o Adam, que cruza a ponte em 5 minutos; “l” representa o Larry, que cruza a ponte em 10 minutos; O valor 0 para um determinado músico significa a ausência daquele sujeito em um determinado lado da ponte, enquanto que o valor 1 significa presença. 19.2. Solução do problema: Para este problema, existem algumas restrições a serem consideradas na busca da solução: O concerto do qual a banda vai participar vai começar em 17 minutos, portanto o tempo total do processo de travessia da ponte não deve ultrapassar este tempo; Apenas dois músicos podem atravessar a ponte por vez; A travessia da ponte sempre deve ser feita com uma lanterna, que pode ser carregada por qualquer um dos músicos. A lanterna não pode ser jogada, portanto, até que todos tenham cruzado a ponte, um dos músicos deve voltar com a lanterna para buscar aqueles que ficaram para trás. O grafo abaixo apresenta alguns estados possíveis (representados pelos vértices) e transições entre os mesmos (representados pelas arestas). A solução para o problema em questão é encontrar um caminho que parta do vértice (1, 1, 1, 1), onde todos os músicos se encontram no lado de origem da ponte, e chegue novamente ao mesmo vértice, indicando que todos os músicos se encontram no lado de destino da ponte. 20. Problema dos dissidentes políticos 20.1. Representação do grafo Vértices: celas a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 e a saída r. Arestas: paredes entre celas e a saída: (a1,a6), (a2,a4), (a2,a5), (a2,a6), (a3,a4), (a4,a5), (a4,a10), (a5,a7), (a5,a9), (a5,a10), (a6,a7), (a7,a8), (a7,a9), (a9,a10), (r,a1), (r,a2), (r,a3), (r,a4), (r,a7), (r,a8), (r,a9), (r,a10). 20.2. Técnica utilizada O problema consiste em encontrar um caminho que passe por todas as celas (vértices) destruindo o menor número de paredes (passando pelo menor número de arestas). Passar por todas as celas consiste em encontrar um caminho que passe por todos os vértices. Em um grafo conexo o menor caminho que passe por todos os vértices é igual ao número de vértices – 1, pois cada aresta liga dois vértices, então se retirarmos 1 aresta eliminamos um vértice do caminho exceto a última aresta a ser retirada que completa o caminho e retira 2 vértices. Por isso a fórmula (nºV – 1). 20.3. Solução No problema temos 11 vértices, logo a melhor solução possível será destruir 10 portões. De uma maneira geral o menor número de portões será sempre o numero de celas existentes menos 1. 21. O problema da construção da ferrovia 21.1. Breve descrição do problema Deve-se construir uma malha ferroviária que ligue um conjunto de cidades. Todos os segmentos que ligam duas cidades possui um custo conhecido. De que modo deve ser feito a definição da malha de modo a ficar mais barata possível. 21.2. Representação do grafo Cada cidade do estado são os vértices e cada aresta são todos os possíveis segmentos ligando cada duas cidades. Neste caso deve-se atribuir a cada aresta o custo da construção do segmento. 21.3. Técnica utilizada Como solução deste problema pode-se utilizar um Algoritmo para calcular o caminho hamiltoniano de custo mínimo. 22. Problema dos Conspiradores Políticos 22.1. Identificação dos vértices e arestas: Este problema pode ser representado através de um grafo onde os vértices representam os agentes A, B, C, D, E, F, G e H e arestas representam as comunicações diretas que são praticáveis entre os mesmos. Além disso, cada aresta possui um peso que corresponde ao fator de risco imposto pela comunicação direta representada. 22.2. Solução do problema: Para se obter o menor risco total neste sistema, é necessário utilizar alguma técnica para se chegar a um grafo de custo global mínimo, ou seja, uma árvore de custo mínimo, onde todos podem se comunicar com o menor fator de risco possível. O Algoritmo de Prim pode ser utilizado para encontrar a árvore de custo mínimo de um grafo: 1. Selecionar qualquer nó e conectá-lo (isto é, adicionar um arco) para o nó mais próximo. 2. Identificar o nó desconectado mais próximo para um nó conectado e então conectar estes dois nós. 3. Repetir o passo 2 até que todos os nós tenham sido conectados. No caso de empate de dois ou mais nós não conectados mais próximos de um nó conectado, escolher arbitrariamente um dos nós não conectados. 23. O Problema da Rede ótica entre tabas 23.1. Representação do grafo Vértices: tabas 1,2,3,4,5. Arestas: ligações possíveis de fibra ótica e seu custo: (1,2,c15), (1,3,c12), (2,3,c6), (2,4,c13), (2,5,c5), (3,4,c6). 23.2. Técnica utilizada O problema consiste em encontrar o que ramos da rede de fibra ótica devem ser construídos de forma a garantir comunicação entre todas as tabas causando o menor impacto ambiental possível (menor custo). Representamos este problema na forma de um grafo onde as tabas são os vértices e as ligações de fibras óticas são as arestas e cada aresta tem um custo. Para sabermos qual a melhor solução devemos encontrar um subgrafo gerador do grafo principal cujo somatório de todos os custos das arestas seja o menor. Um subgrafo gerador SG de um grafo G é um grafo que conexo que contem um conjunto de vértices igual a G, porém o menor número possível de arestas que torne SG conexo. 23.3. Solução Para encontrar a melhor solução formamos todos os subgrafos geradores do grafo principal e somamos os custos de todas as arestas, e o subgrafo gerador com o menor custo total é a melhor solução. No caso o subgrafo gerador seguinte: (1,3,c12), (2,3,c6), (2,5,c5), (3,4,c6). Este grafo apresenta um custo total de 29. 24. O problema da instalação da rede elétrica 24.1. Breve descrição do problema Com base na tabela de possibilidades de instalação de seções da rede elétrica em um loteamento, deve-se determinar: a) Quais seções da rede devem ser construídas a fim de levar energia até o sítio j de forma a ter menor custo. b) Depois de ter a linha de a para j instalada, planejar uma rede para abastecer os outros sítios com menor custo. c) Se a empresa teve prejuízos ao fazer a primeira instalação. 24.2. Representação do grafo Cada vértice é representado pelos sítios e cada aresta é representada pelo ligação elétrica. 24.3. Técnica utilizadaPara se solucionar o problema deve-se gerar todas as possibilidades de ligação e atribuir a cada aresta o peso correspondente ao custo. Posteriormente, pode-se calcular uma árvore geradora mínima de modo a ter o custo mínimo.