# Problema do caminho mais longo

Em teoria dos grafos e ciência da computação teórica, o problema do caminho mais longo é encontrar um caminho simples de comprimento máximo num dado grafo. Um caminho é chamado simples se não tem nenhum vértice repetido; O comprimento de um caminho pode ser medido tanto pelo seu número de arestas, ou (em grafos ponderados) pela soma dos pesos das suas bordas. Em contraste com o problema do caminho mais curto, que pode ser resolvido em tempo polinomial em gráficos sem ciclos de peso negativo, o problema do caminho mais longo é NP-difícil, o que significa que ele não pode ser resolvido em tempo polinomial para grafos arbitrários a menos que P = NP. Fortes resultados difíceis são também conhecidos por mostrar que é difícil aproximar. No entanto, ele tem uma solução em tempo linear para grafos acíclicos direcionados, que tem importantes aplicações em encontrar o caminho crítico em problemas de agendamento.

## NP-dificuldade

A NP-dificuldade do problema do caminho mais longo sem peso pode ser demonstrado por meio de uma redução do problema do caminho Hamiltoniano: um grafo G tem um caminho hamiltoniano se e somente se o seu caminho mais longo tem um comprimento n - 1, onde n é o número de vértices em G. Em razão do fato de que o problema caminho hamiltoniano é NP-completo, esta redução mostra que a versão de decisão do problema do caminho mais longo é também NP-completo. Na decisão, a entrada deste problema é um grafo G e um número k; a saída desejada é "sim" se G contém um caminho de k ou mais arestas, e não de outra maneira.
Se o problema do caminho mais longo pode ser resolvido em tempo polinomial, que pode ser utilizado para resolver este problema de decisão, por descoberta de um caminho mais longo e, em seguida, comparando a sua extensão para o número k. Portanto, o problema do caminho mais longo é NP-difícil. Não é NP-completo, uma vez que não é um problema de decisão.
Em grafos completos com pesos das arestas não-negativos, o problema do caminho mais longo com peso é o mesmo que o problema do caminho do caixeiro viajante, porque o caminho mais longo sempre inclui todos os vértices.

## Gráficos acíclicos e caminhos críticos

Um caminho mais longo entre dois vértices dado s e t em um grafo ponderado G é a mesma coisa que um caminho mais curto em um gráfico -G derivada de G, alterando todo o peso de sua negação. Portanto, se os caminhos mais curtos podem ser encontrados em -G, em seguida, caminhos mais longos podem também ser encontrados em G.
Para a maioria dos gráficos, esta transformação não é útil porque cria ciclos de comprimento negativo em -G. Mas, se G é um gráfico acíclico dirigido, então ciclos negativos não podem ser criados, e um caminho mais longo em G pode ser encontrado no tempo linear através da aplicação de um algoritmo de tempo linear para os caminhos mais curtos em -G, que também é um gráfico acíclico dirigido. Por exemplo, para cada vértice v em um determinado DAG, o comprimento do caminho mais longo terminando em v pode ser obtido pelos seguintes passos:
* Encontre uma ordenação topológica do dado DAG.
* Para cada vértice v do DAG, na ordenação topológica, calcular o comprimento do caminho mais longo terminando em v, olhando para os seus vizinhos de entrada e adicionando um ao comprimento máximo gravado para os vizinhos. Se v não tem vizinhos de entrada, definir o comprimento do caminho mais longo terminando no v para zero. Em ambos os casos, registrar este número para que passos posteriores do algoritmo possa acessá-lo.
Uma vez que isto tenha sido feito, o caminho mais longo em todo o DAG pode ser obtido começando pelo vértice v com o valor maior registrado, então repetidamente andando para trás para a sua vizinha de entrada com o maior valor registrado, e invertendo a sequência de vértices encontrados desta maneira.
O método do caminho crítico para programar um conjunto de atividades envolve a construção de um gráfico acíclico dirigido em que os vértices representam marcos do projeto e as arestas representam as atividades que devem ser executadas após um marco e antes de outro; cada aresta é ponderada por uma estimativa de quantidade de tempo que a atividade correspondente levará para ser concluída. Em tal gráfico, o caminho mais longo a partir do primeiro marco para o último é o caminho crítico, que descreve o tempo total para a conclusão do projeto.
Caminhos mais longos de gráficos acíclicos dirigidos também podem ser aplicados no desenho gráfico em camadas: atribuir cada vértice v de um gráfico acíclico dirigido G para a camada cujo número é o comprimento do caminho mais longo terminando em resultados v numa atribuição de camada para G com o mínimo número possível de camadas.

## Aproximação

Björklund, Husfeldt & Khanna (2004) escrevem que o problema do caminho mais longo em gráficos sem direções não ponderadas "é notório para a dificuldade de entender a sua difícil aproximação". O melhor algoritmo de aproximação de tempo polinomial conhecido para este caso alcança apenas uma relação de aproximação muito fraca, $n/\exp(\Omega ({\sqrt {\log n}}))$. Para todo$\epsilon >0$, não é possível aproximar o caminho mais longo para dentro de um fator de $2^{(\log n)^{1-\epsilon }}$ a menos que NP esteja contido dentro de quasi-tempo polinomial determinístico; no entanto, há uma grande diferença entre este resultado contável e os algoritmos de aproximação conhecidos para este problema.
No caso de gráficos não ponderados, mas dirigidos, fortes resultados contáveis são conhecidos. Para cada $\epsilon >0$ o problema não pode ser aproximado dentro de um fator de $n^{1-\epsilon }$ a menos que P = NP, e com pressupostas complexidade teórica mais fortes que não pode ser aproximado dentro de um fator de $n/\log ^{2+\epsilon }n$. A técnica de codificação de cor pode ser usada para encontrar caminhos de comprimentos logarítmicos, se é que existem, mas o que dá uma relação de aproximação de apenas $O(n/\log n)$.

## Complexidade parametrizada

O problema do caminho mais longo é parâmetro-fixo tratável quando parametrizado pelo comprimento do caminho. Por exemplo, ele pode ser resolvido no tempo linear no tamanho do grafo de entrada (mas exponencial do comprimento do percurso), por um algoritmo que realiza as seguintes etapas:
* Realize uma busca em profundidade do grafo. Seja $d$ a profundidade da árvore de busca em profundidade resultante.
* Use a sequência de caminho raiz-a-folha da árvore de busca em profundidade, na ordem em que foram atravessados pela pesquisa, para a construção de uma decomposição do caminho do gráfico, com largura de caminho $d$.
* Aplicar programação dinâmica a esta decomposição de caminho para encontrar um caminho mais longo no tempo $O(d!2^{d}n)$, onde $n$ é o número de vértices do grafo.
Uma vez que a passagem de saída tem um comprimento pelo menos tão grande como $d$, o tempo de execução também é delimitada por $O(\ell !2^{\ell }n)$, onde $\ell$ é o comprimento do caminho mais longo. Utilizando um código de cores, a dependência do comprimento do percurso pode ser reduzida para exponencial isoladamente. A técnica de programação dinâmica similar mostra que o problema do caminho mais longo também é parâmetro – fixo tratável quando parametrizado pelo terceiro caminho do grafo.
Para os grafos de largura camarilha limitada, o caminho mais longo também pode ser resolvido através de um algoritmo de programação dinâmica em tempo polinomial. No entanto, o expoente do polinômio depende da camarilha de largura do grafo, por isso este algoritmo não é parâmetro – fixo tratável. O problema do caminho mais longo, parametrizado por camarilha de largura, é difícil para a classe de complexidade parametrizada $W[1]$ mostrando que um algoritmo de parâmetro – fixo tratável é improvável de existir.

## Classes especiais de grafos

O problema do caminho mais longo pode ser resolvido em tempo polinomial sobre os complementos de grafos de comparabilidade. Ele também pode ser resolvido em tempo polinomial em qualquer classe de grafos com três larguras limitadas ou de largura pequena associação limitada, tais como os grafos de distância hereditária. No entanto, é NP-difícil, mesmo quando restrito a dividir gráficos, gráficos de círculo ou grafos planares.