Se os pesos das arestas forem números inteiros em , você poderá implementar o Dijkstra para executar no tempo O ( K | V | + | E | ) , seguindo a sugestão de @ rrenaud. Aqui está uma explicação mais explícita.{0,1,…,K}O(K|V|+|E|)
A qualquer momento, as teclas (finitas) na fila de prioridade estão em algum intervalo , em que D é o valor da última chave removida da fila de prioridade. (Cada chave é pelo menos D , porque a sequência de chaves removidas pelo algoritmo de Dijkstra não diminui e cada chave é no máximo D + K , porque cada chave tem o valor d [ u ] + w t ( u , w ) para alguma vantagem ( u ,{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w) onde d [ u ] é a distância da fonte a algum vértice u que já foi removido, então d [ u ] ≤ D. )(u,w)d[u]ud[u]≤D
Por isso, é possível implementar a fila de prioridade com uma matriz circular do tamanho K + 1 , com cada célula contendo um balde. Armazene cada vértice com a chave k no balde na célula A [ h ( k ) ] onde h ( k ) = k mod ( K + 1 ) . Mantenha o controle de D . Execute as operações da seguinte maneira:A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D
eliminar-min : Enquanto está vazio, incremento D . Em seguida, exclua e retorne um vértice de A [ h ( D ) ] .A[h(D)]DA[h(D)]
inserir com a chave : adicione o vértice ao balde de A [ h ( k ) ] .kA [ h ( k ) ]
tecla de diminuição para k ′ : mova o vértice de A [ h ( k ) ] para A [ h ( k ′ ) ] .kk′A [ h ( k ) ]A[h(k′)]
Inserir e diminuir chave são operações de tempo constante; portanto, o tempo total gasto nessas operações será . O tempo total gasto em apagar-min será O ( | V | ) mais o valor final de D . O valor final de D é a distância máxima (finito) a partir da fonte para qualquer vértice (porque uma exclusão min que leva i iterações aumenta D por i ). A distância máxima é no máximo K ( | V | - 1O(|V|+|E|)O(|V|)DDiDi porque cada caminho tem no máximo | V | - 1 arestas. Assim, o tempo total gasto pelo algoritmo é O ( K | V | + | E | ) .K(|V|−1)|V|−1O(K|V|+|E|)