Encontre caminhos mais curtos em um gráfico unipático pesado

12

Diz- se que um gráfico direcionado é unipático se, para quaisquer dois vértices uu e no gráfico , houver no máximo um caminho simples de para .vvG=(V,E)G=(V,E)uuvv

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

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|)O(|V|)ss

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

gprime
fonte
1
O que você tentou até agora? Se você estiver totalmente paralisado, comece pequeno: como são os gráficos unipáticos? Por exemplo, desenhe todos os gráficos unipáticos com um vértice, dois vértices, três vértices e assim por diante. Você pode encontrar um padrão útil. Além disso, você menciona que não há ciclos de peso negativos - pode haver ciclos (de qualquer peso)?
Juho 21/03
@mrm Em que padrão você está pensando? Gráficos unipáticos podem ter ciclos, de uma maneira restrita que não consigo encontrar uma maneira fácil de expressar.
Gilles 'SO- stop be evil' '
@mrm Não. Uma aresta pode pertencer a no máximo um ciclo. Um nó pode pertencer a qualquer número de ciclos: o gráfico em forma de estrela com n pontos E = i n { ( a , b i ) , ( b i , a ) } é unipático (e você pode obter um valor ainda maior proporção de ciclos elementares por nó). nE=in{(a,bi),(bi,a)}
Gilles 'SO- stop be evil' '

Respostas:

10

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(n1)/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.

Excluindo ciclos, existe um único caminho de s para qualquer outro nó u . Se esse caminho passa por um nó intermediário t , o primeiro segmento do caminho é o caminho desejado de s para t . sutst

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|1s=01sst] ] , R [ t ] , t ) .(s=R[R[t]],,R[R[t]],R[t],t)

Atravessar o gráfico

Inicialize R para todos - 1 .R1

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.suR[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]1u

Prove a correção

Por causa da propriedade unipathic, não importa como alcançamos cada nó, desde que não tenhamos completado um ciclo. Existe apenas um caminho simples.

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.

Você pode ter m ciclos de tudo partilha um nó um e nenhum outro nó. O gráfico resultante é unipático. Com ciclos de comprimento 2, esse é um padrão de estrela com um nó central a e qualquer número de nós b i de modo que i , a b i .maabii,abi

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)<nGnG0=#C(G)<#V(G)(a1,,am)

Recolher o ciclo de: deixar G ' ser o gráfico cujos nós são aqueles de L menos { um 1 , ... , um m } além de um nó de um e cujas arestas são todos os bordos de L que não envolvam a um i 's, mais uma L ' b sempre i , um i L b e b L ' um sempre que i , b GG{a1,,am}aGaiaGbi,aiGbbGaG a i . Todo caminho em G ' induz um caminho em G (se o caminho envolver b a c , substitua-o por b a ia i + 1... a jc em G ). Portanto, G ' é unipático. Além disso, como os ciclos em G não compartilham arestas, G possui todos os ciclos em G, exceto o que eliminamos: # Ci,bGaiGGbacbaiai+1ajcGGGGG( G ) = # C ( G ) - 1 . Por indução, # C ( G ) # V ( G ) - 1 . Como # V ( G ) = # V ( G ) - m + 1 , temos # C ( G ) = # C ( G ) +#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+11#V(G)m=nmn1#C(G)=#C(G)+1#V(G)m=nmn1.

This concludes the proof. The traversal follows at most 2|V|22|V|2 edges.

Gilles 'SO- stop being evil'
fonte