Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Grafos implementación:
ESTRUCTURA DE DATOS - 3SC
Profesora: DALIA SILVA MARTINEZ
Fecha de entrega: 12 de diciembre de 2023
Para representar grafos en Java, hay varias formas comunes de hacerlo. Una de las
representaciones más utilizadas es la Lista de Adyacencia, que es especialmente útil para grafos
dispersos. Aquí hay un ejemplo simple de cómo puedes implementar un grafo no dirigido
utilizando una lista de adyacencia en Java:
import java.util.*;
class Grafo {
private Map<Integer, List<Arista>> listaAdyacencia;
public Grafo() {
listaAdyacencia = new HashMap<>();
}
while (!colaPrioridad.isEmpty()) {
int nodoActual = colaPrioridad.poll().vertice;
return distancias;
}
// Agregar vértices
grafo.agregarVertice(1);
grafo.agregarVertice(2);
grafo.agregarVertice(3);
En este ejemplo, la clase Grafo tiene un mapa donde las claves son los vértices y los valores son
listas de sus vecinos. Los métodos agregarVertice, agregarArista, y obtenerVecinos proporcionan
funciones básicas para trabajar con el grafo.
Esta es solo una de las muchas maneras de representar grafos en Java. La elección de la
estructura de datos depende de la naturaleza y requisitos específicos de tu aplicación. Otras
representaciones comunes incluyen la Matriz de Adyacencia y la Lista de Adyacencia con Nodos
y Aristas. Cada enfoque tiene sus ventajas y desventajas en términos de eficiencia y uso de
memoria.
// Constructor que inicializa el nodo con un valor y una lista vacía de aristas
public Nodo(int valor) {
this.valor = valor;
this.aristas = new ArrayList<>();
}
// Método para agregar una arista entre dos nodos con un peso dado
public void agregarArista(int valorOrigen, int valorDestino, int peso) {
Nodo nodoOrigen = buscarNodo(valorOrigen);
Nodo nodoDestino = buscarNodo(valorDestino);
while (!colaPrioridad.isEmpty()) {
Nodo nodoActual = colaPrioridad.poll().nodo;
return distancias;
}
En este ejemplo, la clase Nodo representa los vértices del grafo, la clase Arista representa las
conexiones entre los nodos, y la clase Grafo contiene una lista de nodos y métodos para agregar
nodos y aristas. Este ejemplo asume un grafo no dirigido.
import java.util.Arrays;
import java.util.PriorityQueue;
// Método para agregar una arista entre dos vértices con un peso dado
public void agregarArista(int origen, int destino, int peso) {
matriz[origen][destino] = peso;
matriz[destino][origen] = peso; // Para grafos no dirigidos
}
while (!colaPrioridad.isEmpty()) {
NodoDistancia nodoActual = colaPrioridad.poll();
for (int vecino = 0; vecino < numVertices; vecino++) {
if (matriz[nodoActual.vertice][vecino] != Integer.MAX_VALUE) {
int nuevaDistancia = distancias[nodoActual.vertice] + matriz[nodoActual.vertice]
[vecino];
if (nuevaDistancia < distancias[vecino]) {
distancias[vecino] = nuevaDistancia;
colaPrioridad.add(new NodoDistancia(vecino, nuevaDistancia));
}
}
}
}
return distancias;
}
@Override
public int compareTo(NodoDistancia otro) {
return Integer.compare(this.distancia, otro.distancia);
}
}
Conclusión:
1. Representación de Grafos:
Se proporcionaron ejemplos de dos enfoques comunes para representar grafos:
mediante listas de adyacencia y matrices de adyacencia.
La representación mediante listas de adyacencia es más eficiente para grafos
dispersos, mientras que las matrices de adyacencia son útiles para grafos densos.
2. Implementación del Algoritmo de Dijkstra:
Se incorporó el algoritmo de Dijkstra en dos implementaciones distintas, una para la
representación mediante listas de adyacencia y otra para la representación
mediante una matriz de adyacencia.
La implementación a través de listas de adyacencia aprovecha las clases internas
para modelar nodos y aristas, y utiliza una cola de prioridad para optimizar la
búsqueda de las distancias mínimas.
3. Uso Práctico:
Se proporcionaron ejemplos de cómo agregar vértices, aristas y calcular las
distancias más cortas utilizando el algoritmo de Dijkstra en diferentes tipos de
representaciones de grafos.
4. Consideraciones Generales:
Se enfatizó la versatilidad de las representaciones de grafos y la importancia de
seleccionar la estructura adecuada según la naturaleza y características del grafo en
cuestión.
La modularidad y la reutilización de código se promovieron mediante el uso de
clases y estructuras internas para modelar nodos y aristas.