How do I add an array to an edge of the graph?

2

My graph is implemented as an adjacency matrix. The graph is acyclic. I want to create a method that gets two nodes and creates an edge from one to another with an array of NxM. What is missing or what is wrong?

public class Graph {

    /** Atributos da classe Graph */

    int [][] grafoo; // o grafo está representada por uma matriz de adjacência


    /** Construtor da classe Graph */ 

    public Graph (int dim)
    {
        grafoo = new int [dim][dim];

        int i=0, j;     
        while(i<dim)
        {
            j=0;
            while(j<dim)
            {
                grafoo[i][j]=0;
                j++;
            }
            i++;
        }
    }

    /** Definição do Método */

    void add_edge(int i, int j) //recebe dois nós e adiciona ao grafo uma aresta de um nó para outro com uma matriz de NxM.

        int[][] E = new int[N][M];      
        grafoo[i][j]= E;        
    }
    
asked by anonymous 25.05.2014 / 03:19

1 answer

1

The problem with its grafoo attribute, it is an array of int primitive, when to receive another array, it needs to be more complex.

There are two approaches:

The first is to use Object type in grafoo , which makes it much easier to access this second array, since you only have to access an edge of grafoo , which returns an array, and then access the array again. The code would look like this:

public class Graph {

    /** Atributos da classe Graph */

    Object [][] grafoo; // o grafo está representada por uma matriz de adjacência

    /** Construtor da classe Graph */ 

    public Graph (int dim)
    {
        grafoo = new Object [dim][dim];
        // Nesse caso não precisamos inicializar o grafoo, porque ele ja esta com todos os valores null, se fosse int também não precisaria,
        // já que por ser diferentemente do C, a JVM atribui valor zero para as áreas de memória após a alocação.
    }

    /** Definição do Método */
    public void add_edge(int i, int j) //recebe dois nós e adiciona ao grafo uma aresta de um nó para outro com uma matriz de NxM.
    {
        int[][] E = new int[N][M];      
        grafoo[i][j] = E; // Agora isso é totalmente válido, no caso anterior gerava erro de compilação.        
    }

    public int[][] get_edge(int i, int j)
    {
        return (int[][]) grafoo[i][j]; // Retorna a matriz relativa à aresta i,j
    }

    public void update_edge(int i, int j, int[][] new_edge) // Atualização por sobreescrita
    {
        grafoo[i][j] = new_edge;
    }

    public void update_edge(int i, int j, int k, int l, int value) // Atualização de célula
    {
        int[][] matrix = (int[][]) grafoo[i][j];
        matrix[k][l] = value;
    }
}

This approach is much simpler, but you have the nuisance that with increasing complexity, if you change what you save within the grafoo edges, you will have to review all the places that access grafoo so that no error occurs. Specifically in cast that is done in get_edge .

The second alternative is to use int[][] instead of Object , getting the statement of grafoo like this: int [][][][] , which I find very strange and more confusing to access, however any "mistake" committed will result in compilation error and not in runtime as in the first alternative.

    
25.05.2014 / 16:19