// https://en.wikipedia.org/wiki/Ford–Fulkerson_algorithm in O(V^2 * flow)
public class MaxFlowFordFulkersonSimple {

	public static int maxFlow(int[][] cap, int s, int t) {
		for (int flow = 0; ; ++flow)
			if (!augmentPath(cap, new boolean[cap.length], s, t))
				return flow;
	}

	static boolean augmentPath(int[][] cap, boolean[] vis, int i, int t) {
		if (i == t)
			return true;
		vis[i] = true;
		for (int j = 0; j < vis.length; j++)
			if (!vis[j] && cap[i][j] > 0 && augmentPath(cap, vis, j, t)) {
				--cap[i][j];
				++cap[j][i];
				return true;
			}
		return false;
	}

	// Usage example
	public static void main(String[] args) {
		int[][] capacity = {{0, 1, 1, 0}, {1, 0, 1, 1}, {1, 1, 0, 1}, {0, 1, 1, 0}};
		System.out.println(2 == maxFlow(capacity, 0, 3));
	}
}
