import java.util.*; public class MinCostFlowSimple { public static int[] minCostFlow(int[][] cap, int[][] cost, int s, int t) { int n = cap.length; int[] d = new int[n]; int[] p = new int[n]; for (int flow = 0, flowCost = 0;; ++flow) { Arrays.fill(d, Integer.MAX_VALUE); d[s] = 0; for (int i = 0; i < n - 1; i++) for (int j = 0; j < n; j++) for (int k = 0; k < n; k++) if (cap[j][k] > 0 && d[j] < Integer.MAX_VALUE && d[k] > d[j] + cost[j][k]) { d[k] = d[j] + cost[j][k]; p[k] = j; } if (d[t] == Integer.MAX_VALUE) return new int[] { flowCost, flow }; flowCost += d[t]; for (int v = t; v != s; v = p[v]) { --cap[p[v]][v]; ++cap[v][p[v]]; } } } public static void addEdge(int[][] cap, int[][] cost, int u, int v, int edgeCapacity, int edgeCost) { cap[u][v] = edgeCapacity; cost[u][v] = edgeCost; cost[v][u] = -edgeCost; } // Usage example public static void main(String[] args) { int n = 3; int[][] capacity = new int[n][n]; int[][] cost = new int[n][n]; addEdge(capacity, cost, 0, 1, 3, 1); addEdge(capacity, cost, 0, 2, 2, 1); addEdge(capacity, cost, 1, 2, 2, 1); int[] costFlow = minCostFlow(capacity, cost, 0, 2); System.out.println(6 == costFlow[0]); System.out.println(4 == costFlow[1]); } }