Construyendo un Grafo Ponderado en Java
Representando Grafos Ponderados en Java
En Java, puedes representar un grafo ponderado utilizando una matriz de adyacencia o una lista de adyacencia. La elección entre estas dos representaciones depende de los requisitos específicos de tu aplicación, como el tamaño del grafo, la frecuencia de actualizaciones de aristas y el tipo de operaciones que necesites realizar.
Representación por Matriz de Adyacencia
Una matriz de adyacencia es una matriz bidimensional donde cada elemento representa el peso de la arista entre dos nodos. Si no hay arista entre dos nodos, el elemento correspondiente en la matriz se suele establecer en 0 o un valor grande (por ejemplo, Integer.MAX_VALUE) para indicar la ausencia de conexión.
Aquí hay un ejemplo de cómo puedes representar un grafo ponderado utilizando una matriz de adyacencia en Java:
int[][] adjacencyMatrix = {
{0, 5, 3, 0},
{5, 0, 2, 1},
{3, 2, 0, 4},
{0, 1, 4, 0}
};
Representación por Lista de Adyacencia
Una lista de adyacencia es una colección de listas enlazadas o arrays, donde cada lista enlazada o array representa los vecinos de un nodo y los pesos de las aristas correspondientes.
Aquí hay un ejemplo de cómo puedes representar un grafo ponderado utilizando una lista de adyacencia en Java:
Map<Integer, List<WeightedEdge>> adjacencyList = new HashMap<>();
adjacencyList.put(0, new ArrayList<>(Arrays.asList(
new WeightedEdge(1, 5),
new WeightedEdge(2, 3)
)));
adjacencyList.put(1, new ArrayList<>(Arrays.asList(
new WeightedEdge(0, 5),
new WeightedEdge(2, 2),
new WeightedEdge(3, 1)
)));
adjacencyList.put(2, new ArrayList<>(Arrays.asList(
new WeightedEdge(0, 3),
new WeightedEdge(1, 2),
new WeightedEdge(3, 4)
)));
adjacencyList.put(3, new ArrayList<>(Arrays.asList(
new WeightedEdge(1, 1),
new WeightedEdge(2, 4)
)));
En este ejemplo, la clase WeightedEdge es una clase personalizada que representa una arista con un nodo fuente, un nodo destino y un peso.
Construyendo un Grafo Ponderado en Java
Para construir un grafo ponderado en Java, puedes utilizar ya sea la representación por matriz de adyacencia o la representación por lista de adyacencia, dependiendo de tus requisitos. Aquí hay un ejemplo de cómo puedes crear un grafo ponderado utilizando la representación por lista de adyacencia:
public class WeightedGraph<T> {
private Map<T, List<WeightedEdge<T>>> adjacencyList;
public WeightedGraph() {
adjacencyList = new HashMap<>();
}
public void addVertex(T vertex) {
adjacencyList.putIfAbsent(vertex, new ArrayList<>());
}
public void addEdge(T source, T destination, double weight) {
if (!adjacencyList.containsKey(source)) {
addVertex(source);
}
if (!adjacencyList.containsKey(destination)) {
addVertex(destination);
}
adjacencyList.get(source).add(new WeightedEdge<>(destination, weight));
}
// Otros métodos, como getNeighbors, getWeight, etc.
}
En este ejemplo, la clase WeightedGraph utiliza un Map para almacenar la representación por lista de adyacencia del grafo ponderado. El método addVertex agrega un nuevo nodo al grafo, y el método addEdge agrega una nueva arista ponderada entre dos nodos.