Encuentre los caminos más cortos en un gráfico unipathic pesado

12

Se dice que una gráfica dirigida es antipática si para cualquiera de los dos vértices y v en la gráfica G = ( V , E ) , hay como máximo una ruta simple de u a v .uvG=(V,E)uv

Supongamos que se me da un gráfico antipatía tal que cada borde tiene un peso positivo o negativo, pero no contiene ciclos de peso negativos.G

A partir de esto, quiero encontrar un algoritmo que encuentre todas las rutas más cortas a todos los nodos desde un nodo fuente s .O(|V|)s

No estoy seguro de cómo abordaría este problema. Estoy tratando de ver cómo podría usar el hecho de que no contiene ciclos de peso negativos y, por supuesto, como máximo, una ruta simple entre cualquier nodo a v .uv

gprime
fuente
1
¿Qué has intentado hasta ahora? Si está totalmente atascado, comience con algo pequeño: ¿cómo son realmente los gráficos unipáticos? Por ejemplo, dibuje cada gráfico unipático con un vértice, dos vértices, tres vértices, etc. Puede detectar un patrón útil. Además, usted menciona que no hay ciclos de peso negativos, ¿puede haber ciclos (de cualquier peso)?
Juho
@mrm ¿En qué patrón estás pensando? Los gráficos unipáticos pueden tener ciclos, de una manera restringida que no puedo encontrar una manera fácil de expresar.
Gilles 'SO- deja de ser malvado'
@mrm No. Un borde puede pertenecer como máximo a un ciclo. Un nodo puede pertenecer a cualquier número de ciclos: el gráfico en forma de estrella con puntos E = i n { ( a , b i ) , ( b i , a ) } es antipático (y puede obtener un valor aún mayor relación de ciclos elementales por nodo). nE=in{(a,bi),(bi,a)}
Gilles 'SO- deja de ser malvado'

Respuestas:

10

Elige una representación de datos

Primero, mira el tamaño del resultado. Desea la colección de rutas más cortas de a todos los demás nodos. A menos que la longitud promedio de una ruta esté limitada por una constante (que no lo es: cualquier lista es unipath, y si toma la raíz para s, la longitud total de las rutas es n ( n - 1 ) / 2 donde n es la longitud de la lista), deberá ser cuidadoso en su representación de datos: la estructura que contiene las rutas deberá usar el intercambio entre rutas.ssn(n1)/2n

Excluyendo ciclos, hay una única ruta desde hacia cualquier otro nodo u . Si ese camino va a través de un nodo intermedio t , entonces el primer segmento de la trayectoria es la trayectoria deseada de s a t . sutst

Propongo almacenar el resultado en una matriz, indexada por nodos numerados del al | E | - 1 , con s = 0 . Cada elemento de la matriz almacena el índice del nodo anterior en la ruta a ese nodo (use, por ejemplo, - 1 como marcador especial para los nodos a los que no se puede acceder desde s ). La ruta de s a t será ( s = R [ ... R [ t ] ... ] , ... , R [ R [ t0|E|1s=01sst .(s=R[R[t]],,R[R[t]],R[t],t)

Recorrer el gráfico

Inicializar a todos - 1 .R1

Realice un recorrido de la gráfica primero en profundidad o en anchura a partir de . Cada vez que se alcanza un nodo u , establezca R [ u ] en su predecesor.suR[u]

Como hay ciclos, se puede llegar a un nodo más de una vez. Tener indica que T ya ha sido visitado.R[u]1u

Probar la corrección

Debido a la propiedad antipática, no importa cómo lleguemos a cada nodo, siempre que no hayamos completado un ciclo. Solo hay un camino simple.

Probar la complejidad

O(|V|)Θ(|E0|)V0

Bien entonces. Probemos que en un gráfico unipático, el número de ciclos elementales crece como máximo linealmente con el número de nodos. (Un ciclo elemental es uno que no contiene un ciclo más corto). En la siguiente discusión, supondré que el gráfico no tiene borde propio (ningún borde de un nodo en sí mismo; tales bordes son irrelevantes para la construcción de la ruta de todos modos )

Los gráficos unipáticos pueden tener ciclos, pero de una manera muy limitada. Sería bueno si de alguna manera pudiéramos asociar cada ciclo a un nodo distinto (o al menos, como máximo, un número limitado de ciclos por nodo). ¿Pueden los ciclos compartir un nodo? Por desgracia sí.

maabii,abi

#V(G)G#E(G)#C(G)G#C(G)#V(G)1

#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

GG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacbaiai+1ajcGGGGG#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

2|V|2

Gilles 'SO- deja de ser malvado'
fuente