Diz- se que um gráfico direcionado é unipático se, para quaisquer dois vértices u
Suponha que eu receba um gráfico unipático modo que cada aresta tenha um peso positivo ou negativo, mas não contenha ciclos de peso negativos.G
A partir disso, desejo encontrar um algoritmo que encontre todos os caminhos mais curtos para todos os nós de um nó de origem .O(|V|)
Não tenho certeza de como eu abordaria esse problema. Eu estou tentando ver como eu poderia usar o fato de que ele não contém ciclos de peso negativos e, é claro, no máximo, um caminho simples entre qualquer nó a .u
algorithms
graphs
gprime
fonte
fonte
Respostas:
Escolha uma representação de dados
Primeiro, observe o tamanho do resultado. Você deseja a coleção dos caminhos mais curtos de ss para todos os outros nós. A menos que o comprimento médio de um caminho seja limitado por uma constante (o que não é: qualquer lista é unipath, e se você usar a raiz por s,s o comprimento total dos caminhos será n ( n - 1 ) / 2n(n−1)/2 onde nn é o comprimento da lista), você precisará ter cuidado na sua representação de dados: a estrutura que contém os caminhos precisará usar o compartilhamento entre os caminhos.
Proponho armazenar o resultado em uma matriz, indexada por nós numerados de 0 a | E | - 1 , com s = 0 . Cada elemento da matriz armazena o índice do nó anterior no caminho para esse nó (use, por exemplo, - 1 como um marcador especial para nós inacessíveis a partir de s ). O caminho de s a t será ( s = R [ … R [ t ] … ] , … , R [ R [ t0 |E|−1 s=0 −1 s s t ] ] , R [ t ] , t ) .(s=R[…R[t]…],…,R[R[t]],R[t],t)
Atravessar o gráfico
Inicialize R para todos - 1 .R −1
Execute um percurso de profundidade primeiro ou largura primeiro do gráfico iniciando em s . Cada vez que um nó u é alcançado, defina R [ u ] como seu antecessor.s u R[u]
Como existem ciclos, um nó pode ser alcançado mais de uma vez. Ter R [ u ] ≠ - 1 indica que você já foi visitado.R[u]≠−1 u
Prove a correção
Prove a complexidade
O algoritmo pode alcançar cada nó mais de uma vez, portanto, não está claro se sua complexidade é O ( | V | ) . O trabalho realizado é de fato Θ ( | E 0 | ), em que V 0 são as arestas alcançáveis a partir da origem. Mais precisamente, atingimos um nó mais de uma vez apenas em uma circunstância: se o nó é o primeiro que atingimos em um ciclo específico e, nesse caso, atingimos duas vezes (uma de um caminho simples e uma vez após concluir o ciclo) )O(|V|) Θ(|E0|) V0
Bem então. Vamos provar que, em um gráfico unipático, o número de ciclos elementares cresce no máximo linearmente com o número de nós. (Um ciclo elementar é aquele que não contém um ciclo mais curto.) Na discussão a seguir, assumirei que o gráfico não possui aresta própria (sem aresta de um nó para si mesmo; essas arestas são irrelevantes para a construção do caminho) )
Gráficos unipáticos podem ter ciclos, mas de uma maneira muito restrita. Seria bom se, de alguma forma, pudéssemos associar cada ciclo a um nó distinto (ou pelo menos, no máximo, um número limitado de ciclos por nó). Os ciclos podem compartilhar um nó? Infelizmente sim.
Então, precisamos trabalhar mais. Bem, vamos tentar provar isso indutivamente. Seja # V ( G ) o número de nós em um gráfico G , # E ( G ) o número de arestas e # C ( G ) o número de ciclos elementares que não são auto-arestas. Afirmo que se G é unipático e não está vazio, então # C ( G ) ≤ # V ( G ) - 1 .#V(G) G #E(G) #C(G) G #C(G)≤#V(G)−1
Para um gráfico com um ou dois nós, isso é óbvio. Suponha que a asserção seja válida para todos os gráficos, de modo que # V ( G ) < n e seja G um gráfico unipático com n nós. Se G não tiver ciclo, 0 = # C ( G ) < # V ( G ) , caso encerrado. Caso contrário, deixe ( um 1 , ... , um m ) ser um ciclo elementar.#V(G)<n G n G 0=#C(G)<#V(G) (a1,…,am)
This concludes the proof. The traversal follows at most 2|V|−22|V|−2 edges.
fonte