El algoritmo de ruta más corta y análisis: Dijkstra algoritmo, Floyed, Bellman-Ford, algoritmo SPFA;

Shortest Path Algoritmo: más corto algoritmo de ruta se estudia en la teoría de grafos, un problema algoritmo clásico; Figura dirigido a encontrar el camino más corto entre dos nodos (un nodo y una ruta de acceso que consiste en).

Determinar el punto de partida del problema del camino más corto: el punto de partida conocido, el problema del camino más corto. el algoritmo de Dijkstra para el uso; (camino de la más corta una sola fuente)

Global problema del camino más corto: encontrar el camino más corto a todas las figuras, adecuado para Floyed-Warshall algoritmo; (multi-fuente del camino más corto)

Single-fuente del camino más corto: Dado un grafo dirigido ponderado G = V, E; en el que cada borde es un número real. Además, un conjunto V de vértice posterior, fuente designada; fuente de calcular a partir de la longitud del camino más corto a todos los demás vértices. Esto significa que cada longitud de la parte derecha y la carretera. Este problema se refiere generalmente como una sola fuente problema del camino más corto;

el algoritmo de Dijkstra : algoritmo de Dijkstra utilizando codiciosos idea de que la solución de la elección actual es siempre la mejor solución en cuestión; el algoritmo utilizado para resolver el de una sola fuente problema del camino más corto, no puede manejar pesos negativos, sólo puede ser positivo para la figura de la derecha ; algoritmo utilizando la estrategia codiciosos, de principio s0, seleccione V unvisited [i] de desde s0 más cercana un punto i, que es el más pequeño D [i]; y i es como un punto intermedio, la actualización a través de i, se puede alcanzar el punto la distancia más corta, codicioso continúan para encontrar el punto más cercano no visitado, después de n codiciosos, todos los puntos de acceso se completa, el algoritmo está terminado; la distancia más corta entre los puntos inicial y final de salida;

  • Inicialización d [s0] = 0, de lo contrario D [i] = INF;
  • Después de n codicioso, encontrar la distancia más corta desde el punto de partida s0 a otros puntos;
  • Greedy:
    • Identificar un mínimo d unvisited [K];
    • K es visitado bandera V [k];
    • K es como un punto intermedio, para actualizar la s0 punto de partida, a través de la otra de v k D [v]; matriz puede actualizar Path Tracing, la corriente de grabación más corta desde [v] = k a partir del cual nodo;
  • La diferencia entre el algoritmo de Prim y algoritmo voraz:
    • Algoritmo de Prim: actualizar el conjunto de marcadores no está ajustado a la distancia entre el marcado;
    • Dijkstra algoritmo: la actualización de la fuente se ajusta a una distancia entre el sin marcar;
  • el algoritmo de Dijkstra puede ser la optimización montón usada: Montón de optimización, el algoritmo básico de Dijkstra es encontrar primero la distancia mínima, y ​​luego actualizar, cuando no optimizado, estamos aquí para encontrar la distancia mínima a través del ciclo, podemos utilizar la cola de prioridad para optimizar el ; cola de prioridad montón se utilizan generalmente para poner en práctica, se puede considerar para optimizar el montón; C ++ ha std :: adaptador recipiente priority_queue se puede utilizar;

Floyed algoritmo: el algoritmo Floyed, también conocido como el método de punto de interpolación, utilizando idea del algoritmo de programación dinámica para encontrar el camino más corto a una ponderación entre la figura de múltiples fuentes, el método de múltiples fuentes se puede obtener más corto, puede manejar negativo el lado derecho de la caja , pero no suena negativo, la idea de utilizar un algoritmo de programación dinámica;

  • Set D [i] [j] [k] representa el i a j después de sólo 1,2, .. k cuando estos nodos, el camino más corto i a j. Habrá las dos situaciones siguientes:
    • Después del punto k: d [i] [j] [k] = d [i] [k] [k-1] + d [k] [j] [k-1];
    • No pasa a través punto k: d [i] [j] [k] = d [i] [j] [k-1];
  • ecuación de transición de estados es: d [i] [j] [k] = min {d [i] [j] [k-1], d [i] [k] [k-1] + d [k] [j ] [k-1]}
  • Las condiciones de contorno: D [i] [j] [0] = w [i] [j]; (w [i] [j] denota pesos ij bordes, pesos de las aristas representan la ausencia de un infinito positivo)
  • Desde k se incrementa, d [i] [j] se guarda el estado d [i] [j] [k-1], puede ser reducido por unidimensional matriz de dos dimensiones,:
    • ecuación de transición de estados: d [i] [j] = min {d [i] [k] + d [k] [j], d [i] [j]};
    • Las condiciones de contorno: D [i] [j] = w [i] [j];
    • Enumeración k, k se actualiza usando el punto medio distancia más corta de i a j;

algoritmo Bellman-Ford: Bellman Ford algoritmo es un más corto algoritmo de ruta de fuente única; algoritmo de Dijkstra es relativamente pesos negativos pueden ser tratados para las condiciones: no anillo negativa; simple, pero la complejidad de tiempo es alta; puede ser utilizado para determinar si hay bucle negativo , cada iteración la actualización de la ruta más corta hasta el punto de inicio de cada nodo; (n-1 está presente entre los bordes 6 puntos) si la iteración n-1 veces, de nuevo hay una actualización de iteración camino, entonces hay un anillo negativa;

Algoritmo de pensamiento: una cualquiera de la gráfica de barras más corto, ni contiene ciclos negativos, no va a contener es el bucle de la derecha, que contiene hasta n-1 aristas. Luego, a partir de la fuente puntual s, el nodo puede ser alcanzado, si no es la más corta, la ruta más corta para constituir un s más corta de árboles arraigados. Así, de acuerdo con la raíz de la distancia s del nivel, capa por capa genera el menor alcance cada punto (operación de relajación), por lo tanto el proceso, es el proceso de creación del árbol de ruta más corta; requiere una matriz auxiliar de d [n] y v [n] y la distancia más corta para el rastreo pista de grabación; considerada desde la perspectiva del borde, cada borde para atravesar cada iteración, el ciclo n 1-veces, si el n-ésimo ciclo de todos d valor [n] y no se actualiza, fuera del bucle ; si no es el n-ésimo actualización trayectoria, indica la presencia de un anillo negativo; el algoritmo Bellman-Ford para resolver el camino más largo puede utilizarse para determinar n y el anillo, siempre que la relación de actualización máxima recursión seleccionado similares;

proceso de implementación del algoritmo:

  • Inicial: dist [u] = INF; dist [s] = 0; s es el punto de partida;
  • La recursión: Para cada borde (u, v) operación de relajación; dist [v] = min (dist [v], dist [u] + w [u] [v]); (n-1 funciona como una relajación veces ) 
  • Por último tiempo de recirculación, determina si hay un anillo negativa;

algoritmo SPFA: SPFA (la más corta el Camino más rápido Algorithm); Bellman-Ford algoritmo descrito anteriormente, la complejidad de tiempo del algoritmo es relativamente alta; Bellman-Ford algoritmo requiere tiempos de n recursivos, cada necesario recursiva para escanear todos los lados, sin embargo, cada holgura operaciones no requieren todo el lado flojo, sólo tienen que encontrar el lado más corriente conectado a punto de relajación corto, por lo que el uso de colas, cada momento de la actualización no en cola en una cola, cada uno tomado de una cola vértice, todos sus nodos adyacentes relajación, el éxito relajación si un vértice, tal como el punto de retorno no está en la cola, se pone en cola, tales operaciones se repiten, hasta que la cola está vacía, y si el número de veces que un nodo enqueue más de n veces, indicando la presencia de ciclos negativos; puede utilizar un CNT [n] array para el recuento;

proceso de implementación del algoritmo:

  • Inicialización: dis [s] = 0; dis [i] = INF; crear una nueva cola enqueue el nodo de origen S, s números han sido en cola;
  • Quitar un punto del primer equipo u, u sido quitadas de la cola de la bandera, y se conecta al punto de borde u v operación de la relajación, y v no es correcta si la holgura en la cola, entonces V en cola;
  • Repita hasta que la cola está vacía;

análisis de complejidad de tiempo:

  • Floyed Algoritmo: la búsqueda de múltiples fuentes más corto posible lateral carga de procesamiento; tiempo de complejidad O (n3);
  • el algoritmo de Dijkstra: la búsqueda de más corta única fuente, no puede manejar flanco negativo; complejidad en tiempo de O (n2);
  • Bellman-Ford algoritmo: la búsqueda de una sola fuente más corto lado derecho posible carga de procesamiento; la complejidad de tiempo es O (NM);
  • SPFA algoritmo: la búsqueda de más corta única fuente, Bellman-Ford optimización versión algoritmo puede manejar lado negativo derecho; la complejidad del tiempo es O (km) ~ O (NM ); k es una constante pequeña;

Por favor, consulte el código para lograr: https://github.com/yaowenxu/codes/tree/master/ más corto algoritmo de ruta

Mantenerse al día, por favor indique la fuente; para más información, por favor atención cnblogs.com/xuyaowen; 

referencias:

Problema del camino más corto  de cuatro más camino más corto algoritmo de  Dijkstra algoritmo de  Floyd algoritmo de   diferencia entre Prim y Dijkstra Algoritmo  de Bellman-Ford algoritmo  algoritmo SPFA 

Supongo que te gusta

Origin www.cnblogs.com/xuyaowen/p/shortest-path-algos.html
Recomendado
Clasificación