Eu tenho que encontrar um ciclo negativo em um gráfico ponderado direcionado. Sei como o algoritmo Bellman Ford funciona e que ele me diz se existe um ciclo negativo acessível. Mas não o nomeia explicitamente.
Como posso obter o caminho real do ciclo?
Após a aplicação do algoritmo padrão, já fizemos iterações e nenhuma melhoria adicional deve ser possível. Se ainda podemos diminuir a distância até um nó, existe um ciclo negativo.
Minha idéia é: como conhecemos a borda que ainda pode melhorar o caminho e o antecessor de cada nó, podemos traçar o caminho de volta a partir dessa borda até encontrá-lo novamente. Agora devemos ter o nosso ciclo.
Infelizmente, não encontrei nenhum documento que me diga se isso está correto. Então, ele realmente funciona assim?
Edit: Este exemplo prova que minha ideia está errada. Dado o gráfico a seguir, executamos Bellman-Ford a partir do nó .
Processamos arestas na ordem . Após n - 1 iterações, obtemos as distâncias dos nós: 1 : - 5 2 : - 30 3 : - 15
e tabela pai:
tem pai 3 2 tem pai 3 3 tem pai 2
Agora, fazendo o º iteração vemos que a distância do nó 1 ainda pode ser melhorada usando borda um . Portanto, sabemos que existe um ciclo negativo e a faz parte dele.
Mas, traçando o caminho de volta através da tabela pai, ficamos presos em outro ciclo negativo e nunca se encontram um novo.
Como podemos resolver este problema?
fonte
s'
et'
). Pareceu-me que um novo nó de origem, conectado a todos os vértices existentes por uma borda de qualquer comprimento, aumentaria todos os ciclos.Seu exemplo não contradiz sua ideia. De fato, você encontrou um ciclo negativo. Acho que a idéia que seu exemplo ilustra é que o vértice de origem pode não ser um nó no ciclo negativo.
fonte