Implementando Generic Graph en Java

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.

 

Publicación traducida automáticamente

Artículo escrito por ritz7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *