This Java program is to Implement Ford-Fulkerson algorithm. The Ford–Fulkerson method (named for L. R. Ford, Jr. and D. R. Fulkerson) is an algorithm which computes the maximum flow in a flow network.
The idea behind the algorithm is simple. As long as there is a path from the source (start node) to the sink (end node), with available capacity on all edges in the path, we send flow along one of these paths. Then we find another path, and so on. A path with available capacity is called an augmenting path.
Here is the source code of the Java program to implement ford-fulkerson algorithm. The Java program is successfully compiled and run on a Linux system. The program output is also shown below.
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class FordFulkerson
{
private int[] parent;
private Queue<Integer> queue;
private int numberOfVertices;
private boolean[] visited;
public FordFulkerson(int numberOfVertices)
{
this.numberOfVertices = numberOfVertices;
this.queue = new LinkedList<Integer>();
parent = new int[numberOfVertices + 1];
visited = new boolean[numberOfVertices + 1];
}
public boolean bfs(int source, int goal, int graph[][])
{
boolean pathFound = false;
int destination, element;
for(int vertex = 1; vertex <= numberOfVertices; vertex++)
{
parent[vertex] = -1;
visited[vertex] = false;
}
queue.add(source);
parent = -1;
visited = true;
while (!queue.isEmpty())
{
element = queue.remove();
destination = 1;
while (destination <= numberOfVertices)
{
if (graph[element][destination] > 0 && !visited[destination])
{
parent[destination] = element;
queue.add(destination);
visited[destination] = true;
}
destination++;
}
}
if(visited[goal])
{
pathFound = true;
}
return pathFound;
}
public int fordFulkerson(int graph[][], int source, int destination)
{
int u, v;
int maxFlow = 0;
int pathFlow;
int[][] residualGraph = new int[numberOfVertices + 1][numberOfVertices + 1];
for (int sourceVertex = 1; sourceVertex <= numberOfVertices; sourceVertex++)
{
for (int destinationVertex = 1; destinationVertex <= numberOfVertices; destinationVertex++)
{
residualGraph[sourceVertex][destinationVertex] = graph[sourceVertex][destinationVertex];
}
}
while (bfs(source ,destination, residualGraph))
{
pathFlow = Integer.MAX_VALUE;
for (v = destination; v != source; v = parent[v])
{
u = parent[v];
pathFlow = Math.min(pathFlow, residualGraph[u][v]);
}
for (v = destination; v != source; v = parent[v])
{
u = parent[v];
residualGraph[u][v] -= pathFlow;
residualGraph[v][u] += pathFlow;
}
maxFlow += pathFlow;
}
return maxFlow;
}
public static void main(String...arg)
{
int[][] graph;
int numberOfNodes;
int source;
int sink;
int maxFlow;
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the number of nodes");
numberOfNodes = scanner.nextInt();
graph = new int[numberOfNodes + 1][numberOfNodes + 1];
System.out.println("Enter the graph matrix");
for (int sourceVertex = 1; sourceVertex <= numberOfNodes; sourceVertex++)
{
for (int destinationVertex = 1; destinationVertex <= numberOfNodes; destinationVertex++)
{
graph[sourceVertex][destinationVertex] = scanner.nextInt();
}
}
System.out.println("Enter the source of the graph");
source= scanner.nextInt();
System.out.println("Enter the sink of the graph");
sink = scanner.nextInt();
FordFulkerson fordFulkerson = new FordFulkerson(numberOfNodes);
maxFlow = fordFulkerson.fordFulkerson(graph, source, sink);
System.out.println("The Max Flow is " + maxFlow);
scanner.close();
}
}
$javac FordFulkerson.java $java FordFulkerson Enter the number of nodes 6 Enter the graph matrix 0 16 13 0 0 0 0 0 10 12 0 0 0 4 0 0 14 0 0 0 9 0 0 20 0 0 0 7 0 4 0 0 0 0 0 0 Enter the source of the graph 1 Enter the sink of the graph 6 The Max Flow is 23
Related posts:
Setting Up Swagger 2 with a Spring REST API
Java Program to Implement Aho-Corasick Algorithm for String Matching
Guide to Guava Multimap
Java Program to Check whether Directed Graph is Connected using BFS
Spring Security OAuth2 – Simple Token Revocation
Java Program to Implement Threaded Binary Tree
Java Program to Implement AVL Tree
Default Password Encoder in Spring Security 5
Custom Thread Pools In Java 8 Parallel Streams
More Jackson Annotations
Spring Security OAuth Login with WebFlux
Java Program to Implement Interpolation Search Algorithm
A Quick JUnit vs TestNG Comparison
REST Pagination in Spring
Java Program to Perform Optimal Paranthesization Using Dynamic Programming
Dynamic Proxies in Java
Converting Strings to Enums in Java
Java Program to Generate a Graph for a Given Fixed Degree Sequence
Java Program to Find Maximum Element in an Array using Binary Search
Converting Between Byte Arrays and Hexadecimal Strings in Java
Spring Webflux with Kotlin
Java Program to Implement Min Heap
A Guide to the ResourceBundle
Practical Java Examples of the Big O Notation
Giới thiệu Google Guice – Injection, Scope
Java Program to Perform Inorder Recursive Traversal of a Given Binary Tree
Spring Security 5 for Reactive Applications
Spring Boot - Sending Email
Java Program to Implement Dijkstra’s Algorithm using Queue
Request a Delivery / Read Receipt in Javamail
Spring Boot - Internationalization
RegEx for matching Date Pattern in Java