Obtendo ciclo negativo usando Bellman Ford

20

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?v1,v2,...vk,v1

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.n-1

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ó .1

insira a descrição da imagem aqui

Processamos arestas na ordem . Após n - 1 iterações, obtemos as distâncias dos nós: 1 : - 5 2 : - 30 3 : - 15uma,b,c,dn-1
1:-5
2:-30
3:-15

e tabela pai:
tem pai 3 2 tem pai 3 3 tem pai 213
23
32

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.n1umauma

Mas, traçando o caminho de volta através da tabela pai, ficamos presos em outro ciclo negativo e nunca se encontram um novo.c,duma

Como podemos resolver este problema?

Patrick Schmidt
fonte

Respostas:

14

Você está certo na maior parte. Apenas mais uma adição. Quando você retorna à cadeia predecessora ao tentar encontrar o ciclo, para quando atinge o vértice inicial ou qualquer outro vértice que já tenha sido visto na cadeia predecessora que você viu até agora. Basicamente, você para e gera vértices sempre que detecta um ciclo ao retroceder usando os predecessores.v1

s

Paresh
fonte
link está quebrado.
human.js
Acabei de usar a ideia do Prof. Huang, mas não entendo por que ele adiciona um novo nó de origem e um novo destino ( s'e t'). 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.
AbuNassar 10/11/19
0

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.

Spartan 117
fonte