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:
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.