import java.util.Arrays;
class TransportationProblem {
private static final double INFINITY
= Double.
MAX_VALUE;
public static void main
(String[] args
) { // Problem data
String[] canneries
= {"Bellingham",
"Eugene",
"Albert_Lea"}; String[] warehouses
= {"Sacramento",
"Salt_Lake",
"Rapid_City",
"Albuquerque"};
int[] supply = {75, 125, 100};
int[] demand = {80, 65, 70, 85};
double[][] cost = {
{464, 513, 654, 867},
{352, 416, 690, 791},
{995, 682, 388, 685}
};
// Solve using Vogel's approximation method
double[][] solution = solveTransportation(supply, demand, cost);
// Print solution
printSolution(canneries, warehouses, solution, cost);
}
public static double[][] solveTransportation(int[] supply, int[] demand, double[][] cost) {
int m = supply.length;
int n = demand.length;
double[][] solution = new double[m][n];
int[] s
= Arrays.
copyOf(supply, m
); int[] d
= Arrays.
copyOf(demand, n
);
while (true) {
// Find the cell with minimal cost in row or column with max penalty
int[] cell = findNextCell(cost, s, d);
if (cell == null) break;
int i = cell[0], j = cell[1];
double amount
= Math.
min(s
[i
], d
[j
]); solution[i][j] = amount;
s[i] -= amount;
d[j] -= amount;
if (s[i] == 0) {
for (int k = 0; k < n; k++) cost[i][k] = INFINITY;
}
if (d[j] == 0) {
for (int k = 0; k < m; k++) cost[k][j] = INFINITY;
}
}
return solution;
}
private static int[] findNextCell(double[][] cost, int[] s, int[] d) {
// Simplified version of Vogel's approximation method
double minCost = INFINITY;
int[] cell = null;
for (int i = 0; i < cost.length; i++) {
if (s[i] == 0) continue;
for (int j = 0; j < cost[0].length; j++) {
if (d[j] == 0) continue;
if (cost[i][j] < minCost) {
minCost = cost[i][j];
cell = new int[]{i, j};
}
}
}
return cell;
}
public static void printSolution
(String[] sources,
String[] destinations,
double[][] solution, double[][] cost) {
System.
out.
println("Transportation Solution:"); double totalCost = 0;
for (int i = 0; i < solution.length; i++) {
for (int j = 0; j < solution[0].length; j++) {
if (solution[i][j] > 0) {
double costAmount = solution[i][j] * cost[i][j];
System.
out.
printf("%-10s → %-12s: %6.1f units (Cost: $%8.1f)%n",
sources[i], destinations[j],
solution[i][j], costAmount);
totalCost += costAmount;
}
}
}
System.
out.
printf("%nTotal Transportation Cost: $%.1f%n", totalCost
); }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CgogY2xhc3MgVHJhbnNwb3J0YXRpb25Qcm9ibGVtIHsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBJTkZJTklUWSA9IERvdWJsZS5NQVhfVkFMVUU7CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAvLyBQcm9ibGVtIGRhdGEKICAgICAgICBTdHJpbmdbXSBjYW5uZXJpZXMgPSB7IkJlbGxpbmdoYW0iLCAiRXVnZW5lIiwgIkFsYmVydF9MZWEifTsKICAgICAgICBTdHJpbmdbXSB3YXJlaG91c2VzID0geyJTYWNyYW1lbnRvIiwgIlNhbHRfTGFrZSIsICJSYXBpZF9DaXR5IiwgIkFsYnVxdWVycXVlIn07CiAgICAgICAgCiAgICAgICAgaW50W10gc3VwcGx5ID0gezc1LCAxMjUsIDEwMH07CiAgICAgICAgaW50W10gZGVtYW5kID0gezgwLCA2NSwgNzAsIDg1fTsKICAgICAgICAKICAgICAgICBkb3VibGVbXVtdIGNvc3QgPSB7CiAgICAgICAgICAgIHs0NjQsIDUxMywgNjU0LCA4Njd9LAogICAgICAgICAgICB7MzUyLCA0MTYsIDY5MCwgNzkxfSwKICAgICAgICAgICAgezk5NSwgNjgyLCAzODgsIDY4NX0KICAgICAgICB9OwogICAgICAgIAogICAgICAgIC8vIFNvbHZlIHVzaW5nIFZvZ2VsJ3MgYXBwcm94aW1hdGlvbiBtZXRob2QKICAgICAgICBkb3VibGVbXVtdIHNvbHV0aW9uID0gc29sdmVUcmFuc3BvcnRhdGlvbihzdXBwbHksIGRlbWFuZCwgY29zdCk7CiAgICAgICAgCiAgICAgICAgLy8gUHJpbnQgc29sdXRpb24KICAgICAgICBwcmludFNvbHV0aW9uKGNhbm5lcmllcywgd2FyZWhvdXNlcywgc29sdXRpb24sIGNvc3QpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdW10gc29sdmVUcmFuc3BvcnRhdGlvbihpbnRbXSBzdXBwbHksIGludFtdIGRlbWFuZCwgZG91YmxlW11bXSBjb3N0KSB7CiAgICAgICAgaW50IG0gPSBzdXBwbHkubGVuZ3RoOwogICAgICAgIGludCBuID0gZGVtYW5kLmxlbmd0aDsKICAgICAgICBkb3VibGVbXVtdIHNvbHV0aW9uID0gbmV3IGRvdWJsZVttXVtuXTsKICAgICAgICBpbnRbXSBzID0gQXJyYXlzLmNvcHlPZihzdXBwbHksIG0pOwogICAgICAgIGludFtdIGQgPSBBcnJheXMuY29weU9mKGRlbWFuZCwgbik7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgLy8gRmluZCB0aGUgY2VsbCB3aXRoIG1pbmltYWwgY29zdCBpbiByb3cgb3IgY29sdW1uIHdpdGggbWF4IHBlbmFsdHkKICAgICAgICAgICAgaW50W10gY2VsbCA9IGZpbmROZXh0Q2VsbChjb3N0LCBzLCBkKTsKICAgICAgICAgICAgaWYgKGNlbGwgPT0gbnVsbCkgYnJlYWs7CiAgICAgICAgICAgIAogICAgICAgICAgICBpbnQgaSA9IGNlbGxbMF0sIGogPSBjZWxsWzFdOwogICAgICAgICAgICBkb3VibGUgYW1vdW50ID0gTWF0aC5taW4oc1tpXSwgZFtqXSk7CiAgICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gYW1vdW50OwogICAgICAgICAgICBzW2ldIC09IGFtb3VudDsKICAgICAgICAgICAgZFtqXSAtPSBhbW91bnQ7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoc1tpXSA9PSAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG47IGsrKykgY29zdFtpXVtrXSA9IElORklOSVRZOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkW2pdID09IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbTsgaysrKSBjb3N0W2tdW2pdID0gSU5GSU5JVFk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvbHV0aW9uOwogICAgfQogICAgCiAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBmaW5kTmV4dENlbGwoZG91YmxlW11bXSBjb3N0LCBpbnRbXSBzLCBpbnRbXSBkKSB7CiAgICAgICAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIFZvZ2VsJ3MgYXBwcm94aW1hdGlvbiBtZXRob2QKICAgICAgICBkb3VibGUgbWluQ29zdCA9IElORklOSVRZOwogICAgICAgIGludFtdIGNlbGwgPSBudWxsOwogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29zdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoc1tpXSA9PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3N0WzBdLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAoZFtqXSA9PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlmIChjb3N0W2ldW2pdIDwgbWluQ29zdCkgewogICAgICAgICAgICAgICAgICAgIG1pbkNvc3QgPSBjb3N0W2ldW2pdOwogICAgICAgICAgICAgICAgICAgIGNlbGwgPSBuZXcgaW50W117aSwgan07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGNlbGw7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFNvbHV0aW9uKFN0cmluZ1tdIHNvdXJjZXMsIFN0cmluZ1tdIGRlc3RpbmF0aW9ucywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlW11bXSBzb2x1dGlvbiwgZG91YmxlW11bXSBjb3N0KSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc3BvcnRhdGlvbiBTb2x1dGlvbjoiKTsKICAgICAgICBkb3VibGUgdG90YWxDb3N0ID0gMDsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvbHV0aW9uLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc29sdXRpb25bMF0ubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmIChzb2x1dGlvbltpXVtqXSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29zdEFtb3VudCA9IHNvbHV0aW9uW2ldW2pdICogY29zdFtpXVtqXTsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJS0xMHMg4oaSICUtMTJzOiAlNi4xZiB1bml0cyAoQ29zdDogJCU4LjFmKSVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbaV0sIGRlc3RpbmF0aW9uc1tqXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2x1dGlvbltpXVtqXSwgY29zdEFtb3VudCk7CiAgICAgICAgICAgICAgICAgICAgdG90YWxDb3N0ICs9IGNvc3RBbW91bnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVuVG90YWwgVHJhbnNwb3J0YXRpb24gQ29zdDogJCUuMWYlbiIsIHRvdGFsQ29zdCk7CiAgICB9Cn0=