0

Here is the code:

 // Java program for implementation of Ford Fulkerson algorithm
    import java.util.*;
    import java.lang.*;
    import java.io.*;
    import java.util.LinkedList;

    class MaxFlow
    {
        static final int V = 8; //Number of vertices in graph

        /* Returns true if there is a path from source 's' to sink
          't' in residual graph. Also fills parent[] to store the
          path */
        boolean bfs(int rGraph[][], int s, int t, int parent[])
        {
            // Create a visited array and mark all vertices as not
            // visited
            boolean visited[] = new boolean[V];
            for(int i=0; i<V; ++i)
                visited[i]=false;

            // Create a queue, enqueue source vertex and mark
            // source vertex as visited
            LinkedList<Integer> queue = new LinkedList<Integer>();
            queue.add(s);
            visited[s] = true;
            parent[s]=-1;

            // Standard BFS Loop
            while (queue.size()!=0)
            {
                int u = queue.poll();

                for (int v=0; v<V; v++)
                {
                    if (visited[v]==false && rGraph[u][v] > 0)
                    {
                        queue.add(v);
                        parent[v] = u;
                        visited[v] = true;
                    }
                }
            }

            // If we reached sink in BFS starting from source, then
            // return true, else false
            return (visited[t] == true);
        }

        // Returns tne maximum flow from s to t in the given graph
        int fordFulkerson(int graph[][], int s, int t)
        {
            int u, v;

            // Create a residual graph and fill the residual graph
            // with given capacities in the original graph as
            // residual capacities in residual graph

            // Residual graph where rGraph[i][j] indicates
            // residual capacity of edge from i to j (if there
            // is an edge. If rGraph[i][j] is 0, then there is
            // not)
            int rGraph[][] = new int[V][V];

            for (u = 0; u < V; u++)
                for (v = 0; v < V; v++)
                    rGraph[u][v] = graph[u][v];

            // This array is filled by BFS and to store path
            int parent[] = new int[V];

            int max_flow = 0;  // There is no flow initially

            // Augment the flow while tere is path from source
            // to sink
            while (bfs(rGraph, s, t, parent))
            {
                // Find minimum residual capacity of the edhes
                // along the path filled by BFS. Or we can say
                // find the maximum flow through the path found.
                int path_flow = Integer.MAX_VALUE;
                for (v=t; v!=s; v=parent[v])
                {
                    u = parent[v];
                    path_flow = Math.min(path_flow, rGraph[u][v]);
                }

                // update residual capacities of the edges and
                // reverse edges along the path
                for (v=t; v != s; v=parent[v])
                {
                    u = parent[v];
                    rGraph[u][v] -= path_flow;
                    rGraph[v][u] += path_flow;
                }

                // Add path flow to overall flow
                max_flow += path_flow;
            }

            // Return the overall flow
            return max_flow;
        }

        // Driver program to test above functions
        public static void main (String[] args) throws java.lang.Exception
        {
            int graph[][] =new int[][] { {0, 14, 0, 10, 0, 18, 0, 0},
                                         {0, 0, 18, 0, 14, 0, 0, 0},
                                         {0, 0, 0, 0, 0, 0, 0, 10},
                                         {0, 0, 10, 0, 8, 0, 0, 0},
                                         {0, 0, 14, 0, 8, 0, 20},
                                         {0, 0, 0, 6, 0, 0, 16},
                                         {0, 0, 16, 0, 0, 0, 0, 6},
                                         {0,0,0,0,0,0,0,0}                                   };
            MaxFlow m = new MaxFlow();

            System.out.println("The maximum possible flow is " +
                               m.fordFulkerson(graph, 0, 7));

        }
    }

I'd like to modify it to output the path and the weight of each edge but I'm not sure how. I would like to know the path taken so i can see whats going on graphically

edit: The error as someone has pointed out was that I was missing two elements when i created my matrix. Still unsure how to output the path used.

Beginner Java
  • 63
  • 1
  • 8

1 Answers1

1

ArrayIndexOutOfBoundsException is thrown when an array is accessed at an invalid index.

for (u = 0; u < V; u++)
    for (v = 0; v < V; v++)
        rGraph[u][v] = graph[u][v];

tries to access 8 indexes in 8 one-dimensional arrays in graph and rgraph. But in line# 113, {0, 0, 14, 0, 8, 0, 20}, has 7 elements, which is the 6th one-dimensional array in graph. So accessing graph[5][7] is causing the out of bound error.

Fallen
  • 4,256
  • 1
  • 24
  • 43
  • Duh on my part. I've got the max flow but how would I output the path or the weights of the edges to know whats going on in the graph? – Beginner Java Dec 14 '17 at 01:54