Saltar al contenido
Portada » Algoritmo de Dijkstra en Java

Algoritmo de Dijkstra en Java

algoritmo de dijkstra

El algoritmo de Dijkstra es ampliamente utilizado para encontrar el camino más corto entre dos nodos en un grafo ponderado, y es especialmente útil en aplicaciones de redes y logística. En este artículo, explicaremos cómo implementar el algoritmo de Dijkstra en Java paso a paso.

Introducción al Algoritmo de Dijkstra

El algoritmo de Dijkstra se utiliza para encontrar el camino más corto entre un nodo de inicio y todos los demás nodos en un grafo ponderado, es decir, un grafo en el que cada arista tiene un peso asociado. El algoritmo mantiene un conjunto de nodos cuyas distancias mínimas desde el nodo de inicio son conocidas, y gradualmente explora y actualiza las distancias a otros nodos a medida que avanza.

Implementación en Java

A continuación, mostraremos cómo implementar el algoritmo de Dijkstra en Java.

1. Estructuras de Datos

Primero, necesitamos definir algunas estructuras de datos para representar el grafo y llevar un seguimiento de las distancias mínimas. Usaremos una lista de adyacencia para representar el grafo y un arreglo para mantener las distancias mínimas.

import java.util.*; 
class Grafo { 
private int V; // Número de nodos 
private List<Vertice>[] listaAdyacencia; // Lista de adyacencia 
public Grafo(int V) { 
this.V = V; 
listaAdyacencia = new ArrayList[V]; 
for (int i = 0; i < V; i++) { 
listaAdyacencia[i] = new ArrayList<>(); 
} 
} // Clase interna para representar un vértice class Vertice { int destino; int peso; public Vertice(int destino, int peso) { this.destino = destino; this.peso = peso; } } }

2. Algoritmo de Dijkstra

A continuación, implementaremos el algoritmo de Dijkstra en Java. Usaremos una cola de prioridad (MinHeap) para elegir el nodo con la distancia mínima en cada paso.

import java.util.*;
 public class Dijkstra { 
public static void dijkstra(Grafo grafo, int nodoInicio) { 
int V = grafo.V; 
int[] distancias = new int[V]; 
Arrays.fill(distancias, Integer.MAX_VALUE); // Inicializamos todas las distancias como infinito 
distancias[nodoInicio] = 0; // La distancia al nodo de inicio es 0 
PriorityQueue<Integer> colaPrioridad = new PriorityQueue<>((a, b) -> distancias[a] - distancias[b]); colaPrioridad.add(nodoInicio); 
while (!colaPrioridad.isEmpty()) { 
int u = colaPrioridad.poll(); 
for (Grafo.Vertice vertice : grafo.listaAdyacencia[u]) { 
int v = vertice.destino; 
int peso = vertice.peso; 
if (distancias[u] + peso < distancias[v]) { 
distancias[v] = distancias[u] + peso; colaPrioridad.add(v); } } } // Imprimir las distancias mínimas 
for (int i = 0; i < V; i++) {
 System.out.println("Distancia mínima desde " + nodoInicio + " hasta " + i + ": " + distancias[i]); } } 
public static void main(String[] args) {
 int V = 5; 
Grafo grafo = new Grafo(V); 
grafo.listaAdyacencia[0].add(grafo.new Vertice(1, 2));
 grafo.listaAdyacencia[0].add(grafo.new Vertice(2, 4)); 
grafo.listaAdyacencia[1].add(grafo.new Vertice(2, 1)); 
grafo.listaAdyacencia[1].add(grafo.new Vertice(3, 7)); 
grafo.listaAdyacencia[2].add(grafo.new Vertice(3, 3)); 
grafo.listaAdyacencia[4].add(grafo.new Vertice(3, 2)); 
dijkstra(grafo, 0); } }

3. Resultados

La función dijkstra encuentra las distancias mínimas desde el nodo de inicio a todos los demás nodos en el grafo. En el ejemplo proporcionado, se muestra un grafo de ejemplo con cinco nodos y algunas aristas con pesos asociados. La salida mostrará las distancias mínimas desde el nodo 0 (nodo de inicio) a todos los demás nodos.

Conclusiones

El algoritmo de Dijkstra es una herramienta valiosa para encontrar caminos más cortos en grafos ponderados. La implementación en Java se basa en estructuras de datos como listas de adyacencia y colas de prioridad. Esta implementación proporciona una forma eficiente de encontrar las distancias mínimas en un grafo ponderado.

Espero que este artículo te haya ayudado a comprender cómo implementar el algoritmo de


AsuntoDescripción
Ordenación BurbujaOrdenación algoritmo BubbleSort.
Ordenación InserciónAlgoritmo de ordenación por inserción
Ordenación SelecciónAlgoritmo de ordenación por selección
Ordenación QuicksortAlgoritmo de ordenación eficiente Quicksort
Búsqueda BinariaAlgoritmo de búsqueda binaria
Patrones: Algoritmo ZDetección de patrones con algoritmo Z
Patrones: Algoritmo NaiveDetectar patrones con algoritmo ingenuo o naive
Algoritmo de Dijkstra Como encontrar el camino más corto entre dos nodos en un grafo ponderado
Algoritmo de KruskalSe utiliza para encontrar el árbol de expansión mínimo en un grafo ponderado

AlgoritmoDescripción
Sucesión de FibonacciAprende a programar en Java la famosa sucesión de Fibonacci
Números PrimosAlgoritmo de cálculo en Java para saber si un número es primo
FactorialCálculo del factorial de un número en Java
Número PiAprende a calcular Pi en Java
Número eNúmero e, algoritmo en Java
Raíz cuadradaDesarrollo en Java del algoritmo raíz cuadrada
Números PerfectosDetermina en Java si un número es “perfecto”
Conversión binario – hexadecimalConversor binario a hexadecimal en Java
Generación de números aleatoriosGenerar números aleatorios entre 1 y 100, ejemplos prácticos
Matrices en JavaCrea una matriz en Java y manéjala con soltura
Calculadora en JavaEjemplo sencillo para montar una calculadora en java con interfaz básica