Aqui está uma solução baseada nas idéias da resposta de Realz Slaw. É basicamente uma reexposição de suas idéias que pode ser mais clara ou mais fácil de seguir. O plano é que prosseguiremos em duas etapas:
Em primeiro lugar, vamos construir um gráfico com a seguinte propriedade: qualquer caminho de a em é um caminho mais curto de a em , e cada caminho mais curto de a em também está presente em . Assim, contém exatamente os caminhos mais curtos em : todos os caminhos mais curtos e nada mais. Por acaso, será um DAG.s t S s t L s T L S S G SSstSstGstGSSGS
Em seguida, vamos amostra uniformemente aleatoriamente a partir de todos os caminhos de a em .t SstS
Essa abordagem generaliza para um gráfico direcionado arbitrário , desde que todas as arestas tenham peso positivo, então vou explicar meu algoritmo nesses termos. Seja o peso na borda . (Este generaliza a declaração do problema que você deu. Se você tem um gráfico não ponderado, simplesmente assumir cada aresta tem peso 1. Se você tiver um grafo não direcionado, tratar cada aresta sem direção como as duas arestas dirigidas e )w ( u , v ) u → v ( u , v ) u → v v → uGw(u,v)u→v(u,v)u→vv→u
Passo 1: extracto de . S Execute um algoritmo de caminhos mais curtos de fonte única (por exemplo, algoritmo de Dijkstra) em , iniciando na fonte . Para cada vértice em , deixe denotar a distância de a .s v G d ( s , v ) s vGsvGd(s,v)sv
Agora defina o gráfico seguinte maneira. Consiste em toda aresta modo que (1) seja uma aresta em G e (2) d ( s , v ) = d ( s , u ) + w ( u , v ) .u → v u → vSu→vu→vGd(s,v)=d(s,u)+w(u,v)
O gráfico possui algumas propriedades convenientes:S
Todo caminho mais curto de a em existe como um caminho em : um caminho mais curto em tem a propriedade de que , assim que a borda está presente em .t G S s = v 0 , v 1 , v 2 , … , v k = t G d ( s , v i + 1 ) = d ( s , v i ) + w ( v i , v i + 1 ) v i → v i + 1 SstGSs=v0,v1,v2,…,vk=tGd(s,vi+1)=d(s,vi)+w(vi,vi+1)vi→vi+1S
Cada caminho em a partir de a é um caminho mais curto em . Em particular, considere qualquer caminho em de a , diga . Seu comprimento é dado pela soma dos pesos de suas arestas, ou seja, , mas pela definição de , essa soma é , que é telescópico para . este caminho é um caminho mais curto de a em .s t G S s t s = v 0 , v 1 , v 2 , … , v k = t ∑ k i = 1 w ( v i - 1 , v i ) S ∑ k i = 1 ( d ( s , v i ) - d ( s , v i -SstGSsts=v0,v1,v2,…,vk=t∑ki=1w(vi−1,vi)Sd(s,t)-d(s,s)=d(s,t)stG∑ki=1(d(s,vi)−d(s,vi−1)d(s,t)−d(s,s)=d(s,t)stG
Finalmente, a ausência de arestas de peso zero em implica que é um dag.SGS
Etapa 2: experimente um caminho aleatório. Agora podemos jogar fora os pesos nas bordas em , e provar um caminho aleatório de para em .s t SSstS
Para ajudar, faremos uma pré-computação para calcular para cada vértice em , em que conta o número de caminhos distintos de a . Essa pré-computação pode ser feita em tempo linear, varrendo os vértices de na ordem classificada topologicamente, usando a seguinte relação de recorrência:v S n ( v ) v t Sn(v)vSn(v)vtS
n(v)=∑w∈succ(v)n(w)
onde indica os sucessores de , ou seja, e onde temos o caso base .v succ ( v ) = { w : v → w é uma aresta em S } n ( t ) = 1succ(v)vsucc(v)={w:v→w is an edge in S}n(t)=1
Em seguida, usamos a anotação para provar um caminho aleatório. Primeiro visitamos o nó . Em seguida, escolhemos aleatoriamente um dos sucessores de , com o sucessor ponderado por . Em outras palavras:s s w n ( w )n(⋅)sswn(w)
choosesuccessor(v):
n = 0
for each w in succ(w):
n = n + n(w)
r = a random integer between 0 and n-1
n = 0
for each w in succ(w):
n = n + n(w)
if r < n:
return w
Para escolher um caminho aleatório, repetimos repetidamente este processo: ou seja, e v i + 1 = ( v i ) . O caminho resultante é o caminho desejado e será amostrado uniformemente aleatoriamente em todos os caminhos mais curtos, de s a t .v0=svi+1= choosesuccessor
(vi)st
Espero que isso ajude você a entender a solução de Realz Slaw mais facilmente. Todo o crédito a Realz Slaw pela solução bonita e limpa para esse problema!
O único caso que não trata é o caso em que algumas arestas têm peso 0 ou peso negativo. No entanto, o problema potencialmente não está bem definido nesse caso, pois você pode ter infinitamente muitos caminhos mais curtos.