Primero, un poco de historia: estoy trabajando en construir una clase de gráfico simple con algoritmos de gráficos básicos (Dijkstra, Floyd-Warshall, Bellman-Ford, etc.) para usar como hoja de referencia para una próxima competencia de programación.Encontrar todos los caminos y distancias más cortos usando Floyd-Warshall
Hasta ahora tengo una versión funcional de Floyd-Warshall, pero el inconveniente es que hasta el momento sólo me está poniendo el valor más corto distancia entre dos nodos, no es el camino más corto . Preferiblemente, me gustaría que la creación de ruta se realice dentro del algoritmo en lugar de tener que llamar a otra función para reconstruirla.
Aquí hay algo de información sobre las estructuras de datos que estoy usando:
vector< vector<int> > graph //contains the distance values from each node to each other node (graph[1][3] contains the length of the edge from node #1 to node #3, if no edge, the value is INF
vector< vector<int> > path //contains the "stepping stones" on how to reach a given node. path[st_node][end_node] contains the value of the next node on the way from end_node -> st_node
Aquí está el ejemplo datos de gráfico que estoy usando:
INF 10 INF INF INF INF
INF INF 90 15 INF INF
INF INF INF INF INF 20
INF INF INF INF 20 INF
INF INF 5 INF INF INF
INF INF INF INF INF INF
y aquí está la valores deseados para estar en la variable "ruta" (obtenida al ejecutar Dijkstra desde cada uno de los nodos):
INF 0 4 1 3 2
INF INF 4 1 3 2
INF INF INF INF INF 2
INF INF 4 INF 3 2
INF INF 4 INF INF 2
INF INF INF INF INF INF
Aquí hay un enlace al código que estoy usando actualmente para el algoritmo: (via PasteBin).
¡Cualquier ayuda sería muy apreciada!
Editar: me trataron Wikipedia's code para generar la matriz de ruta y aquí está el resultado:
INF INF 4 1 3 4
INF INF 4 INF 3 4
INF INF INF INF INF INF
INF INF 4 INF INF 4
INF INF INF INF INF 2
INF INF INF INF INF INF
Es algo que funciona, pero tiene problemas cuando se trata de representar pasos "individuales". Por ejemplo, la ruta desde el nodo 0 al nodo 1 no está definida en todas partes. (Pero no obstante, gracias Nali4Freedom por la sugerencia)
Si estoy leyendo este derecho, de acuerdo con la primera fila de 'graph' solo hay un borde del nodo # 0, y conduce al nodo # 1.Entonces la primera fila (o quizás la primera columna) de 'path' debe ser' Inf 1 1 1 1 1'. ¿Qué me estoy perdiendo? – Beta
Ah, ya veo cómo puedes confundirte con eso sí. Cada fila en 'graph' enumera los bordes que salen de ese nodo, mientras que cada fila en' path' contiene la ruta para llegar a 'node # [row_num]'. Por ejemplo, la primera fila del gráfico de 'ruta' correcta significa que para llegar al nodo 0 (fila = 0) desde el nodo 5 (col = 5), el siguiente nodo en el camino de regreso es el nodo 2. Para llegar al nodo 0 desde el nodo 2 usamos el nodo 4, luego el nodo 3, luego el nodo 1, y finalmente llegamos a nuestro destino con el nodo 0. –