2

I have a question where I represent a graph in terms of a 2D array. I have a sample as well, but I have no idea, how it works.... This is the graph I am given enter image description here

And this is how they represent it using a 2D array enter image description here

How does one translate to the other?

Also, this is a part of an implementation of Dijsktra's algorithm. Here is the code for your reference, it is taken from geeksforgeeks

// A Java program for Dijkstra's single source shortest path algorithm.
// The program is for adjacency matrix representation of the graph
import java.util.*;
import java.lang.*;
import java.io.*;

class ShortestPath {
    // A utility function to find the vertex with minimum distance value,
    // from the set of vertices not yet included in shortest path tree
    static final int V = 9;
    int minDistance(int dist[], Boolean sptSet[])
    {
        // Initialize min value
        int min = Integer.MAX_VALUE, min_index = -1;

        for (int v = 0; v < V; v++)
            if (sptSet[v] == false && dist[v] <= min) {
                min = dist[v];
                min_index = v;
            }

        return min_index;
    }

    // A utility function to print the constructed distance array
    void printSolution(int dist[])
    {
        System.out.println("Vertex \t\t Distance from Source");
        for (int i = 0; i < V; i++)
            System.out.println(i + " \t\t " + dist[i]);
    }

    // Function that implements Dijkstra's single source shortest path
    // algorithm for a graph represented using adjacency matrix
    // representation
    void dijkstra(int graph[][], int src)
    {
        int dist[] = new int[V]; // The output array. dist[i] will hold
        // the shortest distance from src to i

        // sptSet[i] will true if vertex i is included in shortest
        // path tree or shortest distance from src to i is finalized
        Boolean sptSet[] = new Boolean[V];

        // Initialize all distances as INFINITE and stpSet[] as false
        for (int i = 0; i < V; i++) {
            dist[i] = Integer.MAX_VALUE;
            sptSet[i] = false;
        }

        // Distance of source vertex from itself is always 0
        dist[src] = 0;

        // Find shortest path for all vertices
        for (int count = 0; count < V - 1; count++) {
            // Pick the minimum distance vertex from the set of vertices
            // not yet processed. u is always equal to src in first
            // iteration.
            int u = minDistance(dist, sptSet);

            // Mark the picked vertex as processed
            sptSet[u] = true;

            // Update dist value of the adjacent vertices of the
            // picked vertex.
            for (int v = 0; v < V; v++)

                // Update dist[v] only if is not in sptSet, there is an
                // edge from u to v, and total weight of path from src to
                // v through u is smaller than current value of dist[v]
                if (!sptSet[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v])
                    dist[v] = dist[u] + graph[u][v];
        }

        // print the constructed distance array
        printSolution(dist);
    }

    // Driver method
    public static void main(String[] args)
    {
        /* Let us create the example graph discussed above */
        int graph[][] = new int[][] { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },
                                    { 4, 0, 8, 0, 0, 0, 0, 11, 0 },
                                    { 0, 8, 0, 7, 0, 4, 0, 0, 2 },
                                    { 0, 0, 7, 0, 9, 14, 0, 0, 0 },
                                    { 0, 0, 0, 9, 0, 10, 0, 0, 0 },
                                    { 0, 0, 4, 14, 10, 0, 2, 0, 0 },
                                    { 0, 0, 0, 0, 0, 2, 0, 1, 6 },
                                    { 8, 11, 0, 0, 0, 0, 1, 0, 7 },
                                    { 0, 0, 2, 0, 0, 0, 6, 7, 0 } };
        ShortestPath t = new ShortestPath();
        t.dijkstra(graph, 0);
    }
}

If this is the graph given to me, for example, how would I represent it using a 2D array? enter image description here

KSP
  • 94
  • 1
  • 11
  • 1
    @AKSingh Thanks for noticing! I've edited it now. I did google it, but I couldn't find any resources which explains this properly. If you have any links which do, please send them here :) Thanks again! – KSP Jul 02 '21 at 04:07
  • Here is one link on graph representations. If this does not help you, do comment. https://www.geeksforgeeks.org/graph-and-its-representations/ – AKSingh Jul 02 '21 at 04:08
  • @AKSingh Thank you! Also, I don't think the 2D array they've given as an input here is an adjacency matrix. They actually contain the weights don't they – KSP Jul 02 '21 at 04:11
  • For instance, consider the graph {{0,1,1,0},{0,0,01},{1,1,0,0},{1,1,1,0}}. How would this be represented? – KSP Jul 02 '21 at 04:15

3 Answers3

2

You can read it like a coordinate table. Every row represents a single vertex and every column value on the same row represents the distance to the Nth vertex.

Examples:

0, 1: first row, second column has the value of 4; which means vertex 0's distance to vertex 1 is 4.

1, 7: second row, 8th column has the value of 11; which means vertex 1's distance to vertex 7 is 11.

And so on...

enter image description here

Onur Yurdupak
  • 61
  • 1
  • 6
1

They have used an adjacency matrix to represent an weighted undirected graphs. According to geeksforgeeks:

Adjacency Matrix: Adjacency Matrix is a 2D array of size V x V where V is the 
number of vertices in a graph. Let the 2D array be adj[][], a slot adj[i][j] = 1 
indicates that there is an edge from vertex i to vertex j. Adjacency matrix for 
undirected graph is always symmetric. Adjacency Matrix is also used to represent 
weighted graphs. If adj[i][j] = w, then there is an edge from vertex i to vertex 
j with weight w.  

As the last two line state, adjacency matrix can be used to store a weighted graph which they have done in this case.

There might be few problems if you use adjacency matrix to represent weighted graphs. Here we use 0 to represent no-edge between any two vertices. If there is any graph which has a weight 0in the graph, then a little change in the adjacency matrix will be needed since 0 already represents no-edge.


In the comments you mention about another graph. That one, however, is not weighted. It is also not undirected graph since its not symmetric.


Do comment if you have any other doubts.

AKSingh
  • 1,535
  • 1
  • 8
  • 17
  • Thank you so much! if the graph is weighted, however, I will edit the question to mention the graph, How would it be represented? – KSP Jul 02 '21 at 04:50
1

I think I've figured it out!

In the example graph, there are 9 vertices. Therefore a 9x9 2D matrix is created, such that:

  • Row 1 corresponds to vertex 0, Row 2 corresponds to vertex 1 and so on

and

  • Column 1 corresponds to vertex 0, Column 2 corresponds to vertex 1 and so on

and the array is filled such that it contains the weight of the edges between node x and y. For example: Row 1 column 2 (map0) contains the weight of the edge between vertex 0 and vertex 1.

Therefore for a graph with n vertices, an nxn array needs to be created such that the location[x][y] in the array contains the weight between edge from x to y.

As for the example graph I had asked the solution for, this would be its corresponding 2D Matrix: It is a little big, because we create a 16x16 2D matrix enter image description here

KSP
  • 94
  • 1
  • 11