Prerrequisito: Clase Genérica
También podemos usarlos para codificar Graph en Java . La clase Graph se implementa usando HashMap en Java . Como sabemos que HashMap contiene una clave y un valor, representamos los Nodes como claves y su lista de adyacencia en valores en el gráfico.
Ilustración: un gráfico no dirigido y no ponderado con 5 vértices.
La array de adyacencia es la siguiente:
La lista de adyacencia es la siguiente:
Acercarse:
Algo poco probable en C++, usamos <> para especificar tipos de parámetros en la creación de clases genéricas.
Sintaxis: Para crear objetos de una clase genérica
BaseType <Type> obj = new BaseType <Type>()
Nota: en el tipo de parámetro, no podemos usar primitivas como ‘int’, ‘char’ o ‘double’.
Ejemplo
Java
// Java program to implement Graph // with the help of Generics import java.util.*; class Graph<T> { // We use Hashmap to store the edges in the graph private Map<T, List<T> > map = new HashMap<>(); // This function adds a new vertex to the graph public void addVertex(T s) { map.put(s, new LinkedList<T>()); } // This function adds the edge // between source to destination public void addEdge(T source, T destination, boolean bidirectional) { if (!map.containsKey(source)) addVertex(source); if (!map.containsKey(destination)) addVertex(destination); map.get(source).add(destination); if (bidirectional == true) { map.get(destination).add(source); } } // This function gives the count of vertices public void getVertexCount() { System.out.println("The graph has " + map.keySet().size() + " vertex"); } // This function gives the count of edges public void getEdgesCount(boolean bidirection) { int count = 0; for (T v : map.keySet()) { count += map.get(v).size(); } if (bidirection == true) { count = count / 2; } System.out.println("The graph has " + count + " edges."); } // This function gives whether // a vertex is present or not. public void hasVertex(T s) { if (map.containsKey(s)) { System.out.println("The graph contains " + s + " as a vertex."); } else { System.out.println("The graph does not contain " + s + " as a vertex."); } } // This function gives whether an edge is present or not. public void hasEdge(T s, T d) { if (map.get(s).contains(d)) { System.out.println("The graph has an edge between " + s + " and " + d + "."); } else { System.out.println("The graph has no edge between " + s + " and " + d + "."); } } // Prints the adjancency list of each vertex. @Override public String toString() { StringBuilder builder = new StringBuilder(); for (T v : map.keySet()) { builder.append(v.toString() + ": "); for (T w : map.get(v)) { builder.append(w.toString() + " "); } builder.append("\n"); } return (builder.toString()); } } // Driver Code public class Main { public static void main(String args[]) { // Object of graph is created. Graph<Integer> g = new Graph<Integer>(); // edges are added. // Since the graph is bidirectional, // so boolean bidirectional is passed as true. g.addEdge(0, 1, true); g.addEdge(0, 4, true); g.addEdge(1, 2, true); g.addEdge(1, 3, true); g.addEdge(1, 4, true); g.addEdge(2, 3, true); g.addEdge(3, 4, true); // Printing the graph System.out.println("Graph:\n" + g.toString()); // Gives the no of vertices in the graph. g.getVertexCount(); // Gives the no of edges in the graph. g.getEdgesCount(true); // Tells whether the edge is present or not. g.hasEdge(3, 4); // Tells whether vertex is present or not g.hasVertex(5); } }
Producción:
Graph: 0: 1 4 1: 0 2 3 4 2: 1 3 3: 1 2 4 4: 0 1 3 The graph has 5 vertex The graph has 7 edges. The graph has an edge between 3 and 4. The graph does not contain 5 as a vertex.