Aquí hay una solución basada en las ideas de la respuesta de Realz Slaw. Básicamente es una reexposición de sus ideas que podría ser más clara o más fácil de seguir. El plan es que procederemos en dos pasos:
En primer lugar, vamos a construir un gráfico con la siguiente propiedad: cualquier camino de s a t en S es una ruta más corta de s a t en G , y cada camino más corto desde s a t en G también está presente en S . Por lo tanto, S contiene exactamente las rutas más cortas en G : todas las rutas más cortas y nada más. Como sucede, S será un DAG.SstSstGstGSSGS
A continuación, vamos a probar de manera uniforme al azar de todos los caminos de a t en S .stS
Este enfoque generaliza a un gráfico dirigido arbitrario , siempre que todos los bordes tengan un peso positivo, por lo que explicaré mi algoritmo en esos términos. Deje w ( u , v ) denotar el peso en el borde u → v . (Esto generaliza el enunciado del problema que dio. Si tiene un gráfico no ponderado, suponga que cada borde tiene peso 1. Si tiene un gráfico no dirigido, trate cada borde no dirigido ( u , v ) como los dos bordes dirigidos u → v y v → u .)Gw(u,v)u→v(u,v)u→vv→u
Paso 1: extracto de . S Ejecute un algoritmo de rutas más cortas de una sola fuente (por ejemplo, el algoritmo de Dijkstra) en , comenzando desde la fuente s . Para cada vértice v en G , supongamos que d ( s , v ) denota la distancia de s a v .GsvGd(s,v)sv
Ahora defina el gráfico siguiente manera. Consiste en cada arista u → v tal que (1) u → v es una arista en G , y (2) d ( s , v ) = d ( s , u ) + w ( u , v ) .Su→vu→vGd(s,v)=d(s,u)+w(u,v)
El gráfico tiene algunas propiedades convenientes:S
Cada ruta más corta de a t en G existe como una ruta en S : una ruta más corta s = v 0 , v 1 , v 2 , … , v k = t en G tiene la propiedad de que d ( s , v i + 1 ) = d ( s , v i ) + w ( v i , v istGSs=v0,v1,v2,…,vk=tG, por lo que el borde v i → v i + 1 está presente enS.d(s,vi+1)=d(s,vi)+w(vi,vi+1)vi→vi+1S
Cada camino en de s a t es un camino más corto en G . En particular, considere cualquier ruta en S de s a t , digamos s = v 0 , v 1 , v 2 , ... , v k = t . Su longitud viene dada por la suma de los pesos de sus bordes, a saber, ∑ k i = 1 w ( v i - 1 , v i )SstGSsts=v0,v1,v2,…,vk=t∑ki=1w(vi−1,vi), pero por la definición de , esta suma es ∑ k i = 1 ( d ( s , v i ) - d ( s , v i - 1 ) , que se telescopía a d ( s , t ) - d ( s , s ) = d ( s , t ) . por lo tanto, este camino es una ruta más corta desde s a t en GS∑ki=1(d(s,vi)−d(s,vi−1)d(s,t)−d(s,s)=d(s,t)stG.
Finalmente, la ausencia de bordes de peso cero en implica que S es un dag.GS
Paso 2: muestra una ruta aleatoria. Ahora podemos tirar a la basura los pesos en los bordes en , y muestra un camino al azar de s a t en S .SstS
Para ayudar con esto, haremos una precomputación para calcular para cada vértice v en S , donde n ( v ) cuenta el número de rutas distintas de v a t . Esta precomputación se puede hacer en tiempo lineal escaneando los vértices de S en orden topológico, utilizando la siguiente relación de recurrencia:n(v)vSn(v)vtS
n(v)=∑w∈succ(v)n(w)
donde denota los sucesores de v , es decir, succ ( v ) = { w : v → w es una ventaja en S } , y donde tenemos el caso base n ( t ) = 1 .succ(v)vsucc(v)={w:v→w is an edge in S}n(t)=1
A continuación, usamos la anotación para muestrear una ruta aleatoria. Primero visitamos el nodo s . Luego, elegimos aleatoriamente uno de los sucesores de s , con el sucesor w ponderado por n ( w ) . En otras palabras: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 elegir una ruta aleatoria, repetidamente repetimos este proceso: es decir, , y v i + 1 = ( v i ) . La ruta resultante es la ruta deseada, y se muestreará de manera uniforme al azar de todas las rutas más cortas de s a t .v0=svi+1= choosesuccessor
(vi)st
Esperemos que esto le ayude a comprender la solución de Realz Slaw más fácilmente. ¡Todo el crédito a Realz Slaw por la solución hermosa y limpia de este problema!
El único caso que esto no maneja es el caso en que algunos bordes tienen peso 0 o peso negativo. Sin embargo, el problema no está bien definido en ese caso, ya que puede tener infinitas rutas más cortas.