O algoritmo de Dijkstra (Dijkstra) de caminho mais curto

Em comparação, o algoritmo Bellman-Ford precisa realizar uma operação de relaxamento em todas as arestas todas as vezes. A complexidade do tempo é O (o número de vértices * o número de arestas) e pode lidar com arestas de peso negativo. No entanto, em nosso na vida real, ao calcular o caminho, ele é extremamente. Raramente encontra arestas de peso negativo, portanto, quando apenas arestas de peso positivo são consideradas, um algoritmo Dijkstra mais otimizado pode ser usado.

O algoritmo de Dijkstra define dois conjuntos, defina todos os vértices como V e:

S = Todos os vértices com o caminho mais curto e o valor de peso mais baixo foram determinados com o ponto de partida s.

W = VS。

O algoritmo move o vértice u com o menor valor de peso em W para S todas as vezes, e executa operações de relaxamento em todas as arestas de u.

Olhe a foto e fale:

O algoritmo de Dijkstra (Dijkstra) de caminho mais curto

inicialização:


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

1. É necessário realizar operações de relaxamento em todas as arestas de A, o resultado


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

2. Retire o menor vértice C em W e coloque-o em S, e execute operações de relaxamento em todas as arestas de C. O resultado

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

3. Retire o menor vértice B em W e coloque-o em S, e execute operações de relaxamento em todas as arestas de B. O resultado

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

4. Retire o menor vértice D em W e coloque-o em S, e execute operações de relaxamento em todas as arestas de D. O resultado


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

5. Pegue o menor vértice F em W em S, e execute operações de relaxamento em todas as arestas de F, o resultado

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

6. Retire o menor vértice E em W e coloque-o em S, e execute operações de relaxamento em todas as arestas de E. O resultado

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

7. Retire o menor vértice G em W e coloque-o em S, e execute operações de relaxamento em todas as arestas de G. O resultado

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

Até agora, podemos obter uma árvore do caminho mais curto:


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

Existem dois lugares para otimizar aqui:

1. Como os vértices com o menor peso devem ser retirados, W deve ser classificado todas as vezes, e o algoritmo de atravessar a matriz para comparação é usado. É melhor usar a fila de prioridade (PriorityQueue), porque a fila de prioridade usa uma estrutura de heap e a complexidade do tempo de classificação é O (nlgn).

2. Se quisermos apenas calcular a distância mais curta do ponto de partida até um determinado ponto, então, ao atravessar, verifique se o menor vértice retirado é o ponto final, se for, apenas pule para fora do loop.

Acho que você gosta

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