Esta é a primeira vez que li sobre algoritmos de atraso polinomial, por isso não tenho 100% de certeza da minha resposta, mas acho que algo como o seguinte deve funcionar.
Escolha uma convenção para representar caminhos que tenham uma ordem total natural definida nela. (Um exemplo seria apenas para listar os vértices do caminho e ordenar lexicograficamente). Escolha sua estrutura de dados preferida no local que suporta pesquisa e inserção logarítmica (por exemplo, uma árvore vermelha e preta). Seja seu gráfico<DG
Defina um algoritmo :F
F(s,t,G,∗D) :
(aqui significa uma referência a uma estrutura de dados local )∗DD
- execute seu algoritmo poli-tempo para retornar um par de caminhos separados por arestas com de para .(P,Q)P<Qst
Se não é em .(P,Q)D
2.1 Insira em (e faça a saída, se você pretende que a saída seja executada conforme o algoritmo).(P,Q)D
2.2 Para cada aresta executeuv∈E(P∪Q)F(s,t,G−{uv},∗D)
Agora, para enumerar todos os seus caminhos, crie um vazio e para cada par com (se o gráfico não for direcionado, caso contrário), execute . Você exibirá todos os caminhos na primeira vez em que os visualizar e também terá uma boa estrutura de dados pesquisável que contém todos os caminhos quando terminar. Observe que esse algoritmo também é executado em tempo polinomial no tamanho da entrada + saída (como qualquer algoritmo de atraso polinomial).s , t ∈ V ( G ) s < t s ≠ t F ( s , t , G , ∗ D )Ds,t∈V(G)s<ts≠tF(s,t,G,∗D)
Duvido que esta seja a melhor maneira de fazer isso, em particular essa abordagem não está no (no tamanho da entrada). Penso que, pensando bem, você poderá encontrar algo que funcione no , embora não seja capaz de construir a estrutura de dados à medida que avança.P S P A C EPSPACEPSPACE