¿Dónde puedo obtener la mejor implementación de Java del algoritmo de ruta más corta de Dijkstra?

Consideremos el siguiente ejemplo de implementación del algoritmo de Dijkstra para encontrar la ruta más corta utilizando el montón binario.

import java.util. *;
La clase estática pública Vertex implementa comparable {
Nombre de cadena final público;
public int dist = Integer.MAX_VALUE; // MAX_VALUE se supone que es infinito
Vértice público anterior = nulo;
public public Map neighbours = new HashMap ();

Vértice público (nombre de cadena)
{
this.name = nombre;
}

privado vacío printPath ()
{
if (this == this.previous)
{
System.out.printf (“% s”, this.name);
}
si no (this.previous == null)
{
System.out.printf (“% s (no alcanzado)”, this.name);
}
más
{
this.previous.printPath ();
System.out.printf (“->% s (% d)”, this.name, this.dist);
}
}

public int compareTo (otro vértice)
{
if (dist == other.dist)
return name.compareTo (otro.nombre);

return Integer.compare (dist, other.dist);
}

@Override public String toString ()
{
return “(” + nombre + “,” + dist + “)”;
}
}

/ ** Crea un gráfico a partir de un conjunto de aristas * /
Gráfico público (Bordes [] bordes) {
graph = new HashMap (edge.length);

// una pasada para encontrar todos los vértices
para (Borde e: bordes) {
if (! graph.containsKey (e.v1)) graph.put (e.v1, nuevo Vertex (e.v1));
if (! graph.containsKey (e.v2)) graph.put (e.v2, nuevo Vertex (e.v2));
}

// otro pase para establecer vértices vecinos
para (Borde e: bordes) {
graph.get (e.v1) .neighbours.put (graph.get (e.v2), e.dist);
//graph.get(e.v2).neighbours.put(graph.get(e.v1), e.dist); // también haga esto para un gráfico no dirigido
}
}

/ ** Ejecuta dijkstra utilizando un vértice de origen especificado * /
public void dijkstra (String startName) {
if (! graph.containsKey (startName)) {
System.err.printf (“El gráfico no contiene el vértice de inicio \”% s \ “\ n”, startName);
regreso;
}
Fuente de vértice final = graph.get (startName);
NavigableSet q = nuevo TreeSet ();

// configurar vértices
para (Vértice v: graph.values ​​()) {
v.previous = v == fuente? fuente: nulo;
v.dist = v == fuente? 0: Integer.MAX_VALUE;
q.add (v);
}

dijkstra (q);
}

/ * Implementación del algoritmo de dijkstra utilizando un montón binario. * /
dijkstra privado vacío (NavigableSet final q) {
Vértice u, v;
while (! q.isEmpty ()) {

u = q.pollFirst (); // vértice con la distancia más corta (la primera iteración devolverá la fuente)
if (u.dist == Integer.MAX_VALUE) descanso; // podemos ignorar u (y cualquier otro vértice restante) ya que son inalcanzables

// mira las distancias a cada vecino
para (Map.Entry a: u.neighbours.entrySet ()) {
v = a.getKey (); // el vecino en esta iteración

final int alternateDist = u.dist + a.getValue ();
if (alternateDist <v.dist) {// ruta más corta al vecino encontrada
q.remove (v);
v.dist = alternateDist;
v.previous = u;
q.add (v);
}
}
}
}

/ ** Imprime una ruta desde el origen hasta el vértice especificado * /
public void printPath (String endName) {
if (! graph.containsKey (endName)) {
System.err.printf (“El gráfico no contiene el vértice final \”% s \ “\ n”, endName);
regreso;
}

graph.get (endName) .printPath ();
System.out.println ();
}
/ ** Imprime la ruta desde el origen a cada vértice (no se garantiza el orden de salida) * /
public void printAllPaths () {
para (Vértice v: graph.values ​​()) {
v.printPath ();
System.out.println ();
}
}
}

clase Graph {
gráfico de mapa final privado ; // mapeo de nombres de vértices a objetos Vertex, construidos a partir de un conjunto de bordes

/ * Un borde del gráfico (solo utilizado por el constructor de gráficos) * /
clase estática pública Edge {
Cadena pública final v1, v2;
public final int dist;
Public Edge (String v1, String v2, int dist) {
this.v1 = v1;
this.v2 = v2;
this.dist = dist;
}
}

clase pública Dijkstra {
Privado estático final Graph.Edge [] GRAPH = {
nuevo Graph.Edge (“a”, “b”, 8),
nuevo Graph.Edge (“a”, “c”, 2),
nuevo Graph.Edge (“a”, “d”, 5),
nuevo Graph.Edge (“b”, “d”, 2),
nuevo Graph.Edge (“b”, “f”, 13),
nuevo Graph.Edge (“c”, “d”, 2),
nuevo Graph.Edge (“c”, “e”, 5),
nuevo Graph.Edge (“d”, “e”, 1),
nuevo Graph.Edge (“d”, “g”, 3),
nuevo Graph.Edge (“e”, “g”, 1),
nuevo Graph.Edge (“f”, “g”, 2),
nuevo Graph.Edge (“f”, “h”, 3),
nuevo Graph.Edge (“g”, “h”, 6),
nuevo Graph.Edge (“g”, “f”, 2),
};
Private static final String START = “a”;
Cadena estática final privada END = “h”;

public static void main (String [] args) {
Gráfico g = nuevo Gráfico (GRÁFICO);
g.dijkstra (START);
g.printPath (END);
}
}

Salida:

a -> c (2) -> d (4) -> e (5) -> g (6) -> f (8) -> h (11)

Puede encontrar la mejor implementación desde el enlace dado:

Algoritmo de Dijsktra

Programa Java para el algoritmo de Dijkstra con impresión de ruta – GeeksforGeeks

Calcule las rutas más cortas en Java implementando el algoritmo de Dijkstra

jabbar86 / Algoritmo Dijkstra-s

Espero que ayude.

Jabbar Memon

Hace un par de años estaba trabajando en un problema que podría resolverse utilizando el algoritmo de Dijkstra. Aquí hay una fuente que quizás quieras explorar

manishdevraj / Routepedia

More Interesting

¿Qué tipo de algoritmos usa Android para mezclar tu música?

¿Por qué la clasificación rápida se considera una clasificación inestable?

Cómo resolver http://www.spoj.com/problems/TRAFFICN/ de spoj

¿Cómo funciona un algoritmo de bogosort cuántico?

¿Cuál es la clave para diferenciar y comparar dos algoritmos de aprendizaje automático?

¿Por qué la complejidad del algoritmo O (logN) significa que los datos disminuyen a la mitad?

¿Cuál es la diferencia entre la estructura de datos y la base de datos para almacenar datos?

¿Cuál es la razón por la cual las compañías gigantes (por ejemplo, Google o Microsoft) hacen preguntas típicas como el árbol de búsqueda binario o el algoritmo tradicional o preguntas como la complejidad del algoritmo? ¿Cuál es el propósito? La mayoría de ellos no se usan en la vida real.

¿Soy solo yo o el algoritmo recursivo de Fibonacci es brillantemente complejo?

¿Cómo manejan los sistemas de reputación los sesgos (sistémicos) que pueden distorsionar significativamente las clasificaciones basadas en tales sistemas?

¿Cuáles son las ventajas de un árbol de búsqueda binaria sobre un árbol rojo-negro?

¿En qué sitio web debo buscar gráficos en la estructura de datos?

¿Cuál es el algoritmo detrás de las OTP (contraseñas de un solo uso)?

¿Cómo podemos transferir datos digitales binarios a un canal físico?

¿Cuál es la forma más rápida de encontrar el número original antes del descuento a mano? (números grandes)