# Teoria Dos Grafos A teoria dos grafos é uma área da matemática e ciência da computação que estuda as relações entre objetos. Seu primeiro uso registrado data de 1736, associado a Leonhard Euler. # História dos Grafos ## Leonhard Euler (1736) - Problema das Pontes de Königsberg: Primeira formulação do conceito de grafos. ## Gustav Kirchoff (1824–1887) - Aplicou grafos em circuitos elétricos, introduzindo as "árvores matemáticas". ## Arthur Cayley (1821–1895) - Expandiu o uso de grafos para a química, enumerando isômeros de hidrocarbonetos. # O que são Grafos? Um **grafo** é uma estrutura de dados fundamental na ciência da computação e matemática, usada para modelar relações entre um conjunto de objetos. ## Vértices - **Vértices** (também chamados de **nós**): são os objetos individuais do grafo. - Exemplos: Em um grafo de rede social, cada pessoa pode ser um vértice. ## Arestas - **Arestas**: são as conexões entre os vértices. - Podem ser **direcionadas** (indicando uma relação unidirecional) ou **não direcionadas** (indicando uma relação bidirecional). - Exemplos: Em um grafo de rede social, uma aresta pode representar uma amizade ou uma conexão entre duas pessoas. # Definição Formal de um Grafo Um grafo `G` é uma tripla ordenada `(V(G), E(G), ψG)` que consiste em: 1. **Conjunto de Vértices (`V(G)`)**: Um conjunto não vazio de vértices. 2. **Conjunto de Arestas (`E(G)`)**: Um conjunto de arestas. 3. **Função de Incidência (`ψG`)**: Associa cada aresta de `G` a um par não ordenado de vértices (não necessariamente distintos) de `G`. Se `e` é uma aresta e `u` e `v` são vértices tais que `ψG(e) = uv`, diz-se que `e` liga `u` e `v`. Os vértices `u` e `v` são chamados de extremidades de `e`. ## Exemplo 1 - **Grafo `G`**: `(V(G), E(G), ψG)` - **Vértices `V(G)`**: `{v1, v2, v3, v4, v5}` - **Arestas `E(G)`**: `{e1, e2, e3, e4, e5, e6, e7, e8}` - **Função de Incidência `ψG(e)`**: - `ψG(e1) = v1v2` - `ψG(e2) = v2v3` - `ψG(e3) = v3v3` - `ψG(e4) = v3v4` - `ψG(e5) = v2v4` - `ψG(e6) = v4v5` - `ψG(e7) = v2v5` - `ψG(e8) = v2v5` ## Exemplo 2 - **Grafo `H`**: `(V(H), E(H), ψH)` - **Vértices `V(H)`**: `{u, v, w, x, y}` - **Arestas `E(H)`**: `{a, b, c, d, e, f, g, h}` - **Função de Incidência `ψH`**: - `ψH(a) = uv` - `ψH(b) = uu` - `ψH(c) = uw` - `ψH(d) = wx` - `ψH(e) = vx` - `ψH(f) = wx` - `ψH(g) = ux` - `ψH(h) = xy` # Isomorfismo de Grafos O isomorfismo de grafos é um conceito chave na teoria dos grafos, usado para determinar se dois grafos são essencialmente os mesmos, apesar de suas possíveis representações visuais diferentes. ## Definição e Características - **Isomorfismo de Grafos**: Dois grafos `G` e `H` são isomórficos (indicado por `G ≅ H`) se existir uma correspondência biunívoca entre seus vértices que preserve as adjacências. ## Complexidade do Problema - **Desafio Computacional**: Determinar o isomorfismo de grafos é um problema complexo, especialmente para grafos grandes. - **Classe NP**: Está na classe NP, mas não se sabe se é NP-completo ou pertence a P. # Principais Classes e Terminologias de Grafos ## Terminologia Básica - **Nós Terminais**: Conjunto de um ou dois vértices que formam uma aresta. - **Laço (Loop)**: Aresta que tem apenas um nó terminal. - **Arestas Paralelas**: Arestas associadas ao mesmo conjunto de vértices. - **Vértices Adjacentes**: Vértices conectados por uma aresta. - **Arestas Adjacentes**: Duas arestas incidentes em um vértice comum. ## Propriedades dos Vértices - **Vértice Adjacente a Si Próprio**: Vértice que é nó terminal de um laço. - **Vértice Isolado**: Vértice sem nenhuma aresta incidente. - **Grau do Vértice**: Número de arestas incidentes a um vértice (laços contam duas vezes). ## Tipos de Grafos ### Grafo Vazio - **Definição**: Um grafo sem vértices nem arestas. ### Grafo Simples - **Características**: Sem laços nem arestas paralelas. - **Aplicações**: Muitas aplicações podem ser modeladas como grafos simples. ### Grafo Não Direcionado - **Propriedade**: Se um vértice `u` está ligado a `v`, então `v` está ligado a `u`. ### Grafos Direcionados (Dígrafos) - **Arestas Dirigidas**: Arestas associadas a um par ordenado de vértices. ### Grafo Completo - **Notação**: `Kn` para um grafo completo com `n` vértices. - **Propriedade**: Todo vértice é adjacente a todos os outros. ### Grafo Bipartido - **Divisão**: Vértices divididos em dois subconjuntos, com arestas apenas entre vértices de subconjuntos diferentes. ### Grafo Valorado - **Característica**: Cada aresta tem um valor (ou peso) associado. ## Outros Tipos de Grafos - **Grafo Simples** - **Multigrafo** - **Pseudografo** - **Grafo Dirigido** - **Multigrafo Dirigido** ## Subgrafo - **Definição**: Um subconjunto de vértices e arestas de um grafo maior. ## Graus dos Vértices - **Propriedade Fundamental**: A soma dos graus de todos os vértices de um grafo é sempre um número par, pois cada aresta contribui com 2 ao grau total. - **Corolário**: Em qualquer grafo, existe um número par de vértices com grau ímpar. ### Exemplos de Aplicação 1. **Grafo com Vértices de Graus 1, 1, 2, e 3**: - **É possível?** Não, pois o grau total seria 7, um número ímpar. 2. **Grafo com Vértices de Graus 1, 1, 3, e 3**: - **É possível?** Sim, pois o grau total é 8, um número par. 3. **Grafo com 10 Vértices de Graus 1, 1, 2, 2, 2, 3, 4, 4, 4, e 6**: - **É possível?** Não, por duas razões: - **Três vértices de grau ímpar** violam o corolário acima. - **Grau total de 29** é ímpar, o que é impossível para qualquer grafo. ## Grafo Regular - **Definição**: Um grafo é regular se todos os seus vértices têm o mesmo grau. - **Exemplo**: Todos os grafos completos são regulares. ### Grafo Direcionado Regular - **Condição Adicional**: O grau de saída e entrada de cada vértice deve ser igual. # Representação Computacional de Grafos e Complexidade de Algoritmos ## Análise de Complexidade de Algoritmos - **Importância**: Projetar algoritmos eficientes desde o início pode economizar recursos e tempo de execução significativos. - **Comparação de Algoritmos**: Analisar a complexidade de algoritmos diferentes permite escolher a opção mais eficiente. ## Complexidade de Tempo e Espaço - **Tempo de Execução**: Medido pelo número de operações como função do tamanho da entrada `n`. - **Espaço de Memória**: Quantidade de memória usada, um fator importante para algoritmos que trabalham com grandes conjuntos de dados. ## Notações de Complexidade de Tempo - Indica o comportamento do algoritmo em diferentes casos: pior (`O`), melhor (`Ω`), e médio (`Θ`). - Classes de complexidade comuns incluem: `O(1)`, `O(n)`, `O(n log n)`, `O(n^2)`, `O(2^n)`, `O(n!)`. ## Representações de Grafos - **Matriz de Incidência**: Uma matriz `n x m` que relaciona vértices a arestas. Cada coluna tem dois `1`s indicando os vértices que a aresta conecta. - **Matriz de Adjacência**: Uma matriz `n x n` onde cada elemento indica se existe uma aresta entre um par de vértices. ### Matriz de Adjacência para Grafos Não Direcionados - A matriz é simétrica em relação à diagonal principal. ### Matriz de Adjacência para Grafos Direcionados - A matriz reflete a direção das arestas entre os vértices. ## Observações sobre Matriz de Adjacência - **Grafos Simples**: O grau de um vértice é a soma dos elementos em sua linha ou coluna. - **Sem Laços**: Diagonal principal com zeros. - **Simetria**: Em grafos não direcionados, a matriz é simétrica em relação à diagonal. A matriz de adjacência é uma forma prática de representar grafos em computadores, mas para grafos com muitos vértices e poucas arestas (grafos esparsos), outras estruturas de dados como listas de adjacências podem ser mais eficientes em termos de espaço. # Lista de Adjacências e Detecção de Vértice Sink ## Lista de Adjacências - Representa um grafo como um vetor de listas. - Cada lista corresponde a um vértice e contém todos os vértices adjacentes. - Eficiente para grafos esparsos com `O(V + E)` de complexidade de espaço. ## Escolhendo a Representação Apropriada - **Matriz de Incidência**: Adequada quando precisamos manter uma relação entre vértices e arestas. - **Matriz de Adjacência**: Ideal para grafos densos, permite verificar a existência de uma aresta em `O(1)`. - **Lista de Adjacência**: Geralmente preferida, especialmente para grafos esparsos. ## Isomorfismo e Matrizes de Adjacência - Verificar isomorfismo "força-bruta" pode exigir a comparação de várias propriedades estruturais e a permutação de matrizes. ## Determinando um Vértice Sink em um Grafo Dirigido KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK # Tipos de Caminhamentos em Grafos Os grafos podem ser explorados através de diferentes tipos de caminhamentos, que são sequências de vértices e arestas. Aqui estão as definições e características de cada tipo: ## Caminho (Walk) - **Definição**: Uma sequência alternada de vértices e arestas adjacentes. - **Características**: - Pode ter vértices e arestas repetidos. - Possui um vértice inicial e final. - O tamanho é o número de arestas no caminho. ## Caminho Fechado (Closed Walk) - **Definição**: Um caminho que começa e termina no mesmo vértice. - **Características**: - Vértices e arestas podem se repetir. - Se tem pelo menos uma aresta, é chamado de ciclo. ## Trajeto (Path) - **Definição**: Um caminho sem arestas repetidas. - **Características**: - Nenhuma aresta é percorrida mais de uma vez. - Pode ter vértices repetidos (exceto em trajetos simples). ## Trajeto Simples (Simple Path) - **Definição**: Um caminho sem arestas nem vértices repetidos. - **Características**: - Todos os vértices e arestas são distintos. ## Circuito (Circuit) - **Definição**: Um trajeto fechado sem arestas repetidas. - **Características**: - O vértice inicial e final são idênticos. - Pode ter vértices repetidos (exceto em circuitos simples). ## Circuito Simples (Simple Circuit) - **Definição**: Um trajeto fechado onde não há arestas e vértices repetidos, exceto os vértices inicial e final que são idênticos. - **Características**: - Também conhecido como ciclo simples. ## Terminologia de Caminhamentos | Tipo | Aresta Repetida? | Vértice Repetido? | Começa e Termina 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 | Não (exceto extremidades) | Sim | # Conectividade em Grafos ## Conectividade - **Definição**: Um grafo é **conexo** se, para qualquer par de vértices `u` e `v`, existe um caminho de `u` para `v`. - **Formalização**: `G é conexo ⟺ ∀ vértices u, v ∈ V(G), ∃ um caminho de u para v`. ### Fundamentos da Conectividade - **Lema a**: Em um grafo conexo, qualquer par de vértices distintos pode ser conectado por um trajeto simples. - **Lema b**: Se `u` e `v` estão em um circuito e uma aresta é removida, ainda existe um trajeto de `u` para `v`. - **Lema c**: Se `G` é conexo e contém um circuito, uma aresta do circuito pode ser removida sem desconectar `G`. - **Teorema**: Um grafo é bipartido se e somente se não contém nenhum ciclo de tamanho ímpar. ## Circuito Euleriano ### Definições - **Circuito Euleriano**: Um circuito que começa e termina no mesmo vértice, passando exatamente uma vez por cada aresta de `G`. - **Trajeto Euleriano**: Uma sequência que começa em um vértice `u`, termina em um vértice `v`, e passa por cada aresta de `G` exatamente uma vez. ### Teoremas - **Teorema 1**: Se `G` possui um circuito euleriano, então todos os vértices de `G` têm grau par. - **Teorema 2**: Se algum vértice de `G` tem grau ímpar, `G` não possui um circuito euleriano. - **Teorema 3**: Se `G` é conexo, não vazio, e todos os vértices têm grau par, então `G` possui um circuito euleriano. ### Corolário do Trajeto Euleriano - Existe um trajeto euleriano de `u` para `v` em `G` se `G` é conexo e exatamente dois vértices, `u` e `v`, têm grau ímpar, com todos os outros vértices tendo grau par. ### Problema das Pontes de Königsberg - É um exemplo clássico que questiona a existência de um percurso que passe por todas as pontes da cidade exatamente uma vez. Este problema levou à formulação dos conceitos de grafos e circuitos eulerianos. # Algoritmo de Fleury e Determinação de Grafos Eulerianos ## Algoritmo de Fleury para Circuitos Eulerianos **Objetivo**: Encontrar um circuito Euleriano em um grafo Euleriano. **Passos do Algoritmo**: 1. **Iniciar**: Comece em qualquer vértice `v`. 2. **Escolha da Aresta**: - Escolha a próxima aresta para atravessar de modo a não desconectar o grafo. - Se todas as arestas restantes desconectariam o grafo, escolha qualquer uma delas (`bridge`). 3. **Exclusão e Continuação**: - Atravesse para o vértice no final da aresta escolhida. - Exclua a aresta do grafo. - Se houver vértices isolados resultantes da exclusão da aresta, remova-os também. 4. **Repetir**: Repita o processo até que todas as arestas tenham sido usadas. **Garantia**: Esse algoritmo sempre produz um circuito Euleriano se o grafo for Euleriano. ## Determinação de Grafos Eulerianos Um grafo é Euleriano se ele é conexo e cada vértice tem um grau par. **Exemplos para Análise**: - **Grafo Completo K2**: Não é Euleriano, pois possui apenas dois vértices com grau 1. - **Grafo Bipartido Completo K3,3**: - É Euleriano, já que é conexo e todos os vértices têm grau 3 (ímpar, portanto não é Euleriano). - **Grafo Cubo**: - É Euleriano, pois é um grafo regular com todos os vértices de grau 3 (ímpar, portanto não é Euleriano). - **Grafo Octaedro**: - É Euleriano, pois é um grafo regular com todos os vértices de grau 4 (par e conexo). - **Grafo de Petersen**: - Não é Euleriano, pois é um grafo regular com grau 3 para cada vértice (ímpar). -- slide 5 aqui # Circuitos Eulerianos e Hamiltonianos em Grafos ## Circuitos em Grafos - **Circuito Euleriano**: Um circuito que inclui todas as arestas de um grafo conectado exatamente uma vez. - **Circuito Hamiltoniano**: Um circuito que passa exatamente uma vez por cada vértice de um grafo. ## Distinção entre os Circuitos - **Euleriano**: - Inclui todas as arestas exatamente uma vez. - Vértices podem ser repetidos (exceto os vértices inicial e final que são idênticos). - **Hamiltoniano**: - Inclui todos os vértices exatamente uma vez (exceto os vértices inicial e final que são idênticos). - Pode não incluir todas as arestas. - Pode não gerar um circuito Euleriano. ## Condições para Existência - **Circuito Euleriano**: - Um grafo possui um circuito Euleriano se e somente se é conexo e todos os vértices têm grau par. - **Circuito Hamiltoniano**: - Não há uma condição necessária e suficiente conhecida para determinar se um grafo possui um circuito Hamiltoniano. - Teoremas como o de Ore e Dirac fornecem condições suficientes sob certas circunstâncias. ### Teoremas Relevantes - **Teorema de Ore (1960)**: Se `G` é um grafo simples com `n (≥ 3)` vértices, e `deg(u) + deg(v) ≥ n` para cada par não adjacentes de vértices `u` e `v`, então `G` é Hamiltoniano. - **Teorema de Dirac (1952)**: Se `G` é um grafo simples com `n (≥ 3)` vértices, e `deg(v) ≥ n/2` para cada vértice `v`, então `G` é Hamiltoniano. ## Problemas Clássicos Relacionados - **Problema do Carteiro Chinês**: - Também conhecido como problema de roteamento de entrega, pode ser resolvido eficientemente quando o grafo é Euleriano. - **Problema do Caixeiro Viajante**: - Relacionado ao ciclo Hamiltoniano, é NP-Completo e não se conhece um algoritmo eficiente para resolvê-lo. - Existem algoritmos heurísticos e de força bruta para encontrar soluções aproximadas. ## Aplicações Práticas - **Coleta de lixo, entregas e limpeza de ruas**: Problema do Carteiro Chinês. - **Planejamento de rotas e logística**: Problema do Caixeiro Viajante. ## Casos Especiais do Problema do Caixeiro Viajante - **PCV Métrico**: Onde as distâncias satisfazem a desigualdade triangular. - **PCV Euclideano**: Onde as distâncias são euclidianas. - **PCV Assimétrico**: Onde a distância de viagem entre dois vértices depende da direção da viagem. # O Problema do Caminho Mínimo O problema do caminho mínimo consiste em encontrar, em um grafo ponderado, o subgrafo que representa o caminho de peso mínimo entre vértices específicos. Existem variantes do problema que incluem: - **Caminho mínimo de fonte única**: Encontrar o caminho mais curto de um vértice específico para todos os outros vértices no grafo. - **Caminho mínimo entre todos os pares**: Encontrar o caminho mais curto entre cada par de vértices no grafo. ## Algoritmos para o Problema do Caminho Mínimo ### Caminhos Mínimos de Fonte Única #### Algoritmo de Bellman-Ford - Utilizado quando os grafos contêm arestas com pesos negativos. - Capaz de detectar ciclos de peso negativo. #### Algoritmo de Dijkstra - Resolve o problema em grafos onde os pesos das arestas são não negativos. - Funcionamento: - Calcula a menor distância do vértice inicial aos seus vizinhos. - Repete o processo para os vizinhos e seus respectivos vizinhos, atualizando as menores distâncias encontradas. ### Limitações do Algoritmo de Dijkstra - Não funciona corretamente se houver arestas com pesos negativos. - Calcula os caminhos mínimos somente a partir de uma única origem. - Para encontrar caminhos mínimos de todos os vértices para todos os outros, é necessário executar o algoritmo para cada vértice, resultando em uma complexidade total de `O(V * E)` na implementação mais simples, onde `V` é o número de vértices e `E` é o número de arestas. ### Caminho Mínimo de Fonte Única em Grafos Acíclicos Dirigidos - Algoritmos específicos podem ser utilizados para grafos acíclicos, que são mais eficientes, uma vez que esses grafos não têm ciclos e, portanto, não podem ter ciclos de peso negativo. ## Aplicações Práticas - Sistemas de navegação GPS. - Redes de telecomunicação. - Planejamento e roteirização logística. # Árvores ## Definições - **Árvore**: Um grafo conexo e sem ciclos (grafos simples) em que há somente um caminho entre qualquer par de vértices. - **Subárvore**: Um subgrafo conexo e acíclico de uma árvore. - **Floresta**: Um grafo que não contém ciclos, podendo ou não ser conexo. ## Fundamentos - **Teorema**: Seja `G` um grafo com `n` vértices. Então, o seguinte é equivalente: 1. `G` é uma árvore; 2. `G` não contém ciclos e possui `n - 1` arestas; 3. `G` está conectado e tem `n - 1` arestas; 4. `G` está conectado e cada aresta é uma ponte; 5. Quaisquer dois vértices de `G` são conectados por exatamente um caminho; 6. `G` não contém ciclos, mas a adição de qualquer nova aresta cria exatamente um ciclo. - **COROLÁRIO**: Se `G` for uma floresta com `n` vértices e `k` componentes, então `G` terá `n - k` arestas. ## Árvore Geradora - Transformar um grafo `G` conectado em árvore: 1. Escolher um ciclo e remover qualquer uma de suas arestas. O grafo resultante permanece conectado. 2. Repetir este procedimento com os ciclos restantes, continuando até que não haja mais ciclos. - O grafo resultante é uma árvore que conecta todos os vértices de `G`, denominada **árvore geradora** de `G`. - **Floresta Geradora**: Realizar este procedimento em cada componente de `G` se `G` é um grafo com `n` vértices, `m` arestas e `k` componentes. ## Árvore Geradora Mínima (Minimal Spanning Tree) - **Definição**: Uma árvore geradora mínima para um grafo com peso é uma árvore geradora que tem o menor peso total possível dentre todas as possíveis árvores geradoras do grafo. ## Algoritmos para obter a AGM ### Complexidade dos Algoritmos - A complexidade dos algoritmos evoluiu de `O(n^2)` para `O(n)`, com uma implementação datada de 2008. ### Os Mais Básicos - **Algoritmo de Kruskal** e **Algoritmo de Prim** são dois dos algoritmos mais populares e gulosos para determinação de árvores geradoras mínimas. ### Algoritmo de Kruskal - Abordagem gulosa: adiciona à floresta uma aresta de menor peso possível a cada etapa. - Usa uma estrutura de dados de conjuntos disjuntos para manter vários conjuntos disjuntos de elementos, cada um contendo os vértices em uma árvore da floresta atual. # Algoritmo de Prim - Proposto originalmente em 1930 por Vojtěch Jarník, em 1957 por Robert C. Prim, e redescoberto por Edsger Dijkstra em 1959. - Inclui, de forma gulosa, vértices na árvore geradora mínima um a um. - Propriedade: as arestas no conjunto A sempre formam uma árvore única, começando em um vértice raiz arbitrário `r` e aumentando até que a árvore abranja todos os vértices em `V`. - Cada etapa adiciona à árvore `A` uma aresta leve que conecta `A` a um vértice isolado. - Implementação eficiente necessita de uma fila de prioridades classificada pelos pesos das arestas. # Voltando ao Problema do Caixeiro Viajante - Consiste em determinar um ciclo hamiltoniano de custo mínimo em um grafo ponderado, direcionado ou não. - **PCV vs. AGM**: Aplicar o algoritmo de AGM em um grafo completo fornece um limite inferior para a solução do PCV. ## Como encontrar o limite inferior para o PCV? - Qualquer ciclo hamiltoniano em um grafo completo ponderado, ao remover um vértice, torna-se um caminho semi-hamiltoniano e deve ser uma árvore geradora. # Algoritmo de Christofides para o PCV - Heurística para encontrar soluções aproximadas para o PCV, garantindo soluções no máximo 1,5 vezes piores do que a ótima. - Publicado por Nicos Christofides em 1976. ## Etapas do Algoritmo de Christofides 1. Criar uma árvore geradora mínima `T` de `G`. 2. Seja `O` o conjunto de vértices de grau ímpar em `T`. 3. Encontrar um casamento perfeito de peso mínimo `M` no subgrafo induzido pelos vértices de `O`. 4. Combinar as arestas de `T` e `M` para formar um multigrafo `H` em que cada vértice tem grau par. 5. Formar um circuito Euleriano em `H`. 6. Transformar o circuito Euleriano em um circuito Hamiltoniano, ignorando vértices repetidos. # Outras Aplicações ## Rede Ferroviária - Conectar cidades minimizando a quantidade total de trilhos. ## Enumeração de Moléculas Químicas - Estruturas moleculares como árvores. ## Árvores de Busca - Estruturas de dados para busca eficiente. ## Otimização de Sistemas Submersos Off-Shore - Minimizar tubulações conectando poços a plataformas. ## Redes Ópticas - Otimizar a distribuição de sinal através de splitters. ## Distribuição de Sinal em Redes - Minimizar custos de distribuição e decodificação. ## Projeto de Redes - Computadores, comunicações, telefônicas, hidráulicas, elétricas, de petróleo e gás. - Análise de agrupamentos, genética, astronomia (quasars), limites de problemas NP-Difíceis, computação móvel.