Saltar al contenido
Portada » Algoritmo de Kruskal en Java

Algoritmo de Kruskal en Java

El algoritmo de Kruskal en Java se utiliza para encontrar el árbol de expansión mínimo en un grafo ponderado, lo que lo hace valioso en problemas de diseño de redes y optimización de rutas.

Introducción al Algoritmo de Kruskal

El algoritmo de Kruskal es un algoritmo de la teoría de grafos que se utiliza para encontrar el árbol de expansión mínimo en un grafo ponderado. El árbol de expansión mínimo es un subconjunto de aristas del grafo original que conecta todos los vértices sin formar ciclos y cuya suma de pesos es mínima. Esto es útil en una variedad de aplicaciones, como la planificación de redes de comunicación y la optimización de rutas.

Implementación en Java

A continuación, veremos cómo implementar el algoritmo de Kruskal en Java.

1. Estructuras de Datos

Primero, necesitamos definir algunas estructuras de datos para representar el grafo y las aristas ordenadas por peso. Usaremos una lista de aristas y una estructura para representar un conjunto disjunto (disjoint-set) que nos ayudará a evitar ciclos durante la construcción del árbol de expansión mínimo.

import java.util.*; 
class Arista implements Comparable<Arista> { 
int origen, destino, peso; 
public int compareTo(Arista otraArista) {
 return this.peso - otraArista.peso; } } 
class ConjuntoDisjunto { 
int[] padre, rango; 
public ConjuntoDisjunto(int n) { 
padre = new int[n]; 
rango = new int[n]; 
for (int i = 0; i < n; i++) { 
padre[i] = i;
 rango[i] = 0; } } 
public int encontrar(int x) {
 if (padre[x] != x) { 
padre[x] = encontrar(padre[x]); } 
return padre[x]; }
 public void unir(int x, int y) {
 int raizX = encontrar(x); 
int raizY = encontrar(y); 
if (raizX != raizY) { 
if (rango[raizX] < rango[raizY]) { 
padre[raizX] = raizY; }
 else if (rango[raizX] > rango[raizY]) {
 padre[raizY] = raizX; } 
else { 
padre[raizY] = raizX; rango[raizX]++; } } } }

2. Algoritmo de Kruskal

A continuación, implementaremos el algoritmo de Kruskal en Java. El algoritmo ordena las aristas por peso y luego recorre estas aristas en orden ascendente, agregándolas al árbol de expansión mínimo si no forman ciclos.

public class Kruskal { 
public static List<Arista> kruskal(List<Arista> aristas, int numVertices) { 
List<Arista> arbolExpansionMinimo = new ArrayList<>(); 
ConjuntoDisjunto conjuntoDisjunto = new ConjuntoDisjunto(numVertices); 
Collections.sort(aristas); // Ordenar aristas por peso 
for (Arista arista : aristas) {
 int raizOrigen = conjuntoDisjunto.encontrar(arista.origen); 
int raizDestino = conjuntoDisjunto.encontrar(arista.destino); 
if (raizOrigen != raizDestino) { 
arbolExpansionMinimo.add(arista); 
conjuntoDisjunto.unir(raizOrigen, raizDestino); } } 
return arbolExpansionMinimo; } 
public static void main(String[] args) { 
int numVertices = 6; 
List<Arista> aristas = new ArrayList<>(); 
aristas.add(new Arista(0, 1, 2)); 
aristas.add(new Arista(0, 2, 4)); 
aristas.add(new Arista(1, 2, 1));
 aristas.add(new Arista(1, 3, 7)); 
aristas.add(new Arista(2, 3, 3)); 
aristas.add(new Arista(3, 4, 2)); 
aristas.add(new Arista(4, 5, 5)); 
List<Arista> arbolExpansionMinimo = kruskal(aristas, numVertices); 
System.out.println("Aristas del árbol de expansión mínimo:"); 
for (Arista arista : arbolExpansionMinimo) { 
System.out.println(arista.origen + " - " + arista.destino + " (" + arista.peso + ")"); } } }

3. Resultados

La función kruskal encuentra las aristas que componen el árbol de expansión mínimo en el grafo dado. En el ejemplo proporcionado, se muestra un grafo con seis vértices y las aristas con pesos asociados. El resultado es el conjunto de aristas que forman el árbol de expansión mínimo.

Conclusiones

El algoritmo de Kruskal es una herramienta poderosa para encontrar el árbol de expansión mínimo en un grafo ponderado, lo que es útil en diversas aplicaciones, como la planificación de redes y la optimización de rutas. La implementación en Java se basa en estructuras de datos como conjuntos disjuntos y una cola de prioridad para ordenar las aristas por peso.

Espero que este artículo te haya ayudado a comprender cómo implementar el algoritmo de Kruskal en Java. Si tienes alguna pregunta o necesitas más información, no dudes en preguntar. ¡Buena suerte con tus proyectos de programación!


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