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(n−1)/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=0−1sst .(s=R[…R[t]…],…,R[R[t]],R[t],t)
Recorrer el gráfico
Inicializar a todos - 1 .R−1
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í.
maabi∀i,a⇆bi
#V(G)G#E(G)#C(G)G#C(G)≤#V(G)−1
#V(G)<nGnG0=#C(G)<#V(G)(a1,…,am)
G′G{a1,…,am}aGaia→G′b∃i,ai→Gbb→G′a∃i,b→GaiG′Gb→a→cb→ai→ai+1→…→aj→cGG′GG′G#C(G′)=#C(G)−1#C(G′)≤#V(G′)−1#V(G′)=#V(G)−m+1#C(G)=#C(G′)+1≤#V(G)−m=n−m≤n−1
2|V|−2