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:
Spring RestTemplate Error Handling
Chuyển đổi Array sang ArrayList và ngược lại
Java Program to Implement Floyd Cycle Algorithm
Java Program to Implement wheel Sieve to Generate Prime Numbers Between Given Range
String Initialization in Java
Deploy a Spring Boot App to Azure
Java Program to Implement Radix Sort
Spring Security 5 – OAuth2 Login
Spring AMQP in Reactive Applications
Connect through a Proxy
Java Program to Implement Sorted Singly Linked List
Count Occurrences of a Char in a String
Java Program to Delete a Particular Node in a Tree Without Using Recursion
Hướng dẫn Java Design Pattern – Object Pool
Posting with HttpClient
Interface trong Java 8 – Default method và Static method
Java Program to Implement Gaussian Elimination Algorithm
Java Program to Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Deque và ArrayDeque trong Java
Converting Between Byte Arrays and Hexadecimal Strings in Java
Lấy ngày giờ hiện tại trong Java
Using JWT with Spring Security OAuth
Guava – Join and Split Collections
How to Break from Java Stream forEach
Java Program to Generate Random Numbers Using Middle Square Method
Examine the internal DNS cache
Java Program to implement Circular Buffer
Using Spring ResponseEntity to Manipulate the HTTP Response
Java Program to Implement ConcurrentHashMap API
A Guide to ConcurrentMap
Java Program to Implement RoleUnresolvedList API
Java Program to Find MST (Minimum Spanning Tree) using Kruskal’s Algorithm