El algoritmo de Dijkstra (Dijkstra) de la ruta más corta

En comparación, el algoritmo de Bellman-Ford necesita realizar una operación de relajación en todos los bordes cada vez. La complejidad de tiempo es O (el número de vértices * el número de bordes) y puede manejar bordes de peso negativo. Sin embargo, en nuestro En la vida real, cuando se calcula la ruta, es extremadamente Rara vez encuentra bordes de peso negativos, por lo que cuando solo se consideran los bordes de peso positivos, se puede utilizar un algoritmo de Dijkstra más optimizado.

El algoritmo de Dijkstra establece dos conjuntos, establece todos los vértices establecidos en V, luego:

S = Todos los vértices con la ruta más corta y el valor de peso más bajo se han determinado con el punto de partida s.

W = VS。

El algoritmo mueve el vértice u con el valor de peso más pequeño en W a S cada vez y realiza operaciones de relajación en todos los bordes de u.

Mira la foto y habla:

El algoritmo de Dijkstra (Dijkstra) de la ruta más corta

inicialización:


S=A0
W=B∞,C∞,D∞,E∞,F∞,G∞

1. Es necesario realizar operaciones de relajación en todos los bordes de A, el resultado


S=A0
W=B6,C4,D∞,E∞,F∞,G∞

2. Saque el vértice más pequeño C en W y colóquelo en S, y realice operaciones de relajación en todos los bordes de C. El resultado

S=A0,C4
W=B6,D9,E∞,F11,G∞

3. Saque el vértice más pequeño B en W y colóquelo en S, y realice operaciones de relajación en todos los bordes de B. El resultado

S=A0,B6,C4
W=D9,E11,F11,G∞

4. Saque el vértice más pequeño D en W y colóquelo en S, y realice operaciones de relajación en todos los bordes de D. El resultado


S=A0,B6,C4,D9
W=E11,F10,G∞

5. Tome el vértice más pequeño F en W en S y realice operaciones de relajación en todos los bordes de F, el resultado

S=A0,B6,C4,D9,F10
W=E11,G∞

6. Saque el vértice más pequeño E en W y colóquelo en S, y realice operaciones de relajación en todos los bordes de E. El resultado

S=A0,B6,C4,D9,E11,F10
W=G∞

7. Saque el vértice más pequeño G en W y colóquelo en S, y realice operaciones de relajación en todos los bordes de G. El resultado

S = A0, B6, C4, D9, E11, F10, G∞

Hasta ahora, podemos obtener un árbol de ruta más corto:


A——B=6
A——C=4
A——C——D=9
A——B——E=11
A——C——D——F=10
A无法到达G

Hay dos lugares para optimizar aquí:

1. Debido a que los vértices con el menor peso deben ser eliminados, W debe ordenarse cada vez y se usa el algoritmo de atravesar la matriz para comparar. Es mejor usar la cola de prioridad (PriorityQueue), porque la cola de prioridad usa una estructura de montón y la complejidad del tiempo de clasificación es O (nlgn).

2. Si solo queremos calcular la distancia más corta desde el punto de inicio hasta un cierto punto, entonces al atravesar, verifique si el vértice más pequeño tomado es el punto final, si es así, simplemente salte del bucle.

Supongo que te gusta

Origin blog.51cto.com/15067227/2603617
Recomendado
Clasificación