O peso precisa somar custo, sem nunca devolvê-lo.
O requisito é w(u, v) ≥ 0 para cada aresta. Com uma aresta negativa, uma rota descoberta mais tarde poderia baratear um vértice já finalizado; a escolha gulosa deixaria de ser segura.
Escolha o custo conhecido mais baixo e relaxe o mapa.
Execuções concluídas nesta bancada, medidas durante o playback ativo no navegador e salvas apenas neste dispositivo.
Execute o algoritmo até o fim para transformar esta bancada em uma série de medições reais.
Dijkstra's Algorithm utiliza relaxamento para encontrar o menor caminho ponderado. Use quando as arestas têm custos não negativos e você quer uma distância ótima garantida.
some o custo conhecido
O caminho se revela quando cada relaxamento reduz o custo conhecido.
Complexidade do modelo com fila de prioridade, uma estrutura que escolhe o menor custo pendente. A bancada usa uma fila linear para deixar essa escolha visível; por isso, ela não é um benchmark de desempenho.
O algoritmo examina arestas (E) e usa uma fila de prioridade para escolher o próximo vértice. O log V representa os níveis necessários para reorganizar essas escolhas.
Quando V dobra, cada ajuste da fila acrescenta apenas um nível; o trabalho principal ainda acompanha as arestas examinadas.Escolha duas técnicas diferentes. As curvas usam a mesma escala visual para explicar como o custo tende a aumentar.
Use este par para comparar a exploração de um grafo não ponderado com o custo adicional de priorizar caminhos de menor distância. Breadth-First Search tende a crescer mais devagar do que Dijkstra quando aumentam vértices (V) e arestas (E). Isso descreve tendência assintótica, não mede o tempo do seu aparelho.
Dijkstra constrói caminhos mínimos a partir de uma origem em grafos ponderados. Em vez de escolher por ordem de descoberta, ele sempre extrai da fronteira o vértice com menor custo provisório. Sob pesos não negativos, esse custo não pode mais ser reduzido: o vértice passa de candidato a distância definitiva.
O requisito é w(u, v) ≥ 0 para cada aresta. Com uma aresta negativa, uma rota descoberta mais tarde poderia baratear um vértice já finalizado; a escolha gulosa deixaria de ser segura.
Ao testar u → v, compare dist[u] + w(u, v) com dist[v]. Se o candidato for menor, atualize os dois registros. O predecessor guarda a rota para que o caminho possa ser reconstruído depois.
Qualquer rota alternativa teria de sair da fronteira com custo igual ou maior e ainda acrescentar um peso não negativo. Por isso, nenhum caminho futuro pode reduzir a distância do vértice extraído.
O((V + E) log V) combina relações e prioridade.Com lista de adjacência e min-heap, cada extração e atualização de prioridade custa logarítmico, resultando em O((V + E) log V). Distâncias, predecessores, estados e fila ocupam O(V) adicional. Uma implementação pode inserir uma prioridade nova e ignorar entradas antigas quando forem extraídas, dispensando um decrease-key explícito.
Use Dijkstra para custo, tempo ou distância acumulada sem valores negativos. Se todas as arestas tiverem o mesmo custo, BFS resolve o problema com uma fila FIFO e uma garantia em número de saltos. Se a entrada puder conter pesos negativos, Bellman-Ford é a alternativa; em um ciclo negativo alcançável, não existe menor custo finito.
O algoritmo não decide o que “melhor” significa: ele minimiza exatamente a soma definida nas arestas. Uma rota de menor distância não minimiza automaticamente risco, emissões ou número de baldeações. Modele esses critérios no peso, preserve a não negatividade e registre predecessores quando a interface precisar explicar o trajeto, não apenas exibir seu custo.
A mesma rede pode ser explorada com uma fila, uma pilha ou uma função de custo. Os trechos mostram o núcleo da decisão; funções de apoio, como recuperar a rota ou escolher o menor custo, aparecem com nomes descritivos para manter o foco da explicação.
function dijkstra(graph, start, goal) { // Relax edges from the lowest known costconst distance = { [start]: 0 };const open = [start];const settled = new Set();while (open.length) {const node = takeLowest(open, distance);if (settled.has(node)) continue;settled.add(node);if (node === goal) return distance;for (const edge of graph[node]) {const next = distance[node] + edge.weight;if (next < (distance[edge.to] ?? Infinity)) {distance[edge.to] = next; if (!open.includes(edge.to)) open.push(edge.to);}}}return distance;}