Pregunta

Supongamos que tengo una DABED DABED DABED DABED DABED DABED DABED DABED / "Math-contenedor"> $ g= (v, e, r \ in v, w \ in e \ to \ mathbb {z}) $ Donde existe una secuencia de conjuntos no vacíos (llamados "niveles") $ l_0={r \}, l_1 \ subset v, \ ldots, l_n \ subconjunto v $ tal que $ l_0 \ cup \ ldots \ taza l_n= v $ y los bordes salientes de los nodos en $L_i $ solo conecte a los nodos en $ l_ {i + 1} $ .

¿Hay un algoritmo en línea que pueda mantener un conjunto de caminos más cortos a medida que se agreguen más niveles a este DAG?En otras palabras, puede responder a la consulta "¿Cuál es la ruta de peso mínima de la raíz a algún nodo $ n $ en el nivel inferior del gráfico?", InclusoA medida que se agreguen más niveles.

No pude encontrar ninguna investigación que se dirige a esta pregunta.

¿Fue útil?

Solución

Si entiendo su problema correctamente, entonces probablemente no encontró ninguna investigación porque el problema es fácil de resolver.

A menos que me haya perdido algo, desea mantener un "recipiente de matemáticas" de "l_ span Class=" capa "> $ g= (l_0, \ cuco \ dots \ (l_0, \ taza \ dots \ taza l_k, e) $ (Como se define en su pregunta) y respalde las siguientes dos operaciones:

  • init (): cree un gráfico con solo una capa $ l_0 $ , un solo vértice $ r \ en l_0 $ , y sin bordes.

  • consulta (): devuelva $ \ min_ {v \ in l_k} d (r, v) $ .

  • add_layer ( $ l_ {k + 1}, e '$ ): se le da un nuevo conjunto $ L_ {k + 1} $ de vértices y un conjunto de bordes ponderados $ e '\ subesteq (l_k \ veces l_ {k + 1}) $ . El conjunto de vértices de $ g $ se actualiza a $ l_0 \ taza \ ldots \ taza l_k \ taza l_ {k + 1 } $ y el conjunto de borde de $ g $ se actualiza a $ e \ copa e '$ .

Puede hacer lo anterior almacenando: 1) Para cada vértice $ v \ in l_k $ , la distancia $ D [v] $ Form $ s $ a $ v $ en $ G $ , y 2) la distancia mínima $ d ^ * $ de $ s $ a un vértice del último nivel.

La operación inicial equivale a configurar $ d [r]= 0 $ . Para realizar la operación de consulta, simplemente devuelva $ d ^ * $ .

para implementar Add_layer ( $ l_ {k + 1}, e '$ ), usted procede de la siguiente manera:

  • set $ d ^ * $ a $ + \ infty $ ,
  • para cada vértice $ v \ in l_ {k + 1} $ :
    • set $ d [v]= + \ infty $
    • para cada borde $ (u, v) $ en $ e '$ :
      • Actualizar $ d [v] $ a $ \ min \ {d [v], d [u] + w (u, v) \} $
    • Actualizar $ d ^ * $ a $ \ min \ {d ^ *, d [v] \} $

Observe que esto requiere tiempo proporcional a $ | l_ {k + 1} | + | E '| $ , y por lo tanto es asintóticamente óptimo. Aviso también que esta solución no necesita almacenar $ g $ .

Otros consejos

Supongamos que tiene la longitud de los caminos más cortos de la raíz a todos los nodos en el nivel $ l_i $ y llame a este $ s \ in l_i \ to \ mathbb {z} $ .Ahora suponga que los bordes de $ l_i $ a $ l_ {i + 1} $ se llaman $ E_I $ .Luego, la longitud del camino más corto a un nodo $ n $ en $ l_ {i + 1} $ se define por $ \ min \ {w (x, n) + s (x) \ mid (x, n) \ in e_i \} $ .Mantener los caminos reales es una extensión fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a cs.stackexchange
scroll top