import
java.util.Arrays;
public
class
TransportationProblem {
static
int
INF =
1000
;
public
static
void
main(String[] args) {
int
[][] grid = {{
3
,
1
,
7
,
4
}, {
2
,
6
,
5
,
9
}, {
8
,
3
,
3
,
2
}};
int
[] supply = {
300
,
400
,
500
};
int
[] demand = {
250
,
350
,
400
,
200
};
int
ans = solveTransportationProblem(grid, supply, demand);
System.out.println(
"The basic feasible solution is "
+ ans);
}
public
static
int
solveTransportationProblem(
int
[][] grid,
int
[] supply,
int
[] demand) {
int
n = grid.length;
int
m = grid[
0
].length;
int
ans =
0
;
while
(!isEmpty(supply) && !isEmpty(demand)) {
int
[] rowDiff =
new
int
[n];
int
[] colDiff =
new
int
[m];
findDiff(grid, rowDiff, colDiff);
int
maxi1 = Arrays.stream(rowDiff).max().getAsInt();
int
maxi2 = Arrays.stream(colDiff).max().getAsInt();
if
(maxi1 >= maxi2) {
for
(
int
i =
0
; i < n; i++) {
if
(rowDiff[i] == maxi1) {
int
mini1 = Arrays.stream(grid[i]).min().getAsInt();
for
(
int
j =
0
; j < m; j++) {
if
(grid[i][j] == mini1) {
int
mini2 = Math.min(supply[i], demand[j]);
ans += mini2 * mini1;
supply[i] -= mini2;
demand[j] -= mini2;
if
(demand[j] ==
0
) {
for
(
int
r =
0
; r < n; r++) {
grid[r][j] = INF;
}
}
else
{
Arrays.fill(grid[i], INF);
}
break
;
}
}
break
;
}
}
}
else
{
for
(
int
j =
0
; j < m; j++) {
if
(colDiff[j] == maxi2) {
int
mini1 = INF;
for
(
int
[] ints : grid) {
mini1 = Math.min(mini1, ints[j]);
}
for
(
int
i =
0
; i < n; i++) {
int
val2 = grid[i][j];
if
(val2 == mini1) {
int
mini2 = Math.min(supply[i], demand[j]);
ans += mini2 * mini1;
supply[i] -= mini2;
demand[j] -= mini2;
if
(demand[j] ==
0
) {
for
(
int
r =
0
; r < n; r++) {
grid[r][j] = INF;
}
}
else
{
Arrays.fill(grid[i], INF);
}
break
;
}
}
break
;
}
}
}
}
return
ans;
}
public
static
boolean
isEmpty(
int
[] array) {
for
(
int
value : array) {
if
(value !=
0
) {
return
false
;
}
}
return
true
;
}
public
static
void
findDiff(
int
[][] grid,
int
[] rowDiff,
int
[] colDiff) {
for
(
int
i =
0
; i < grid.length; i++) {
int
[] arr = Arrays.copyOf(grid[i], grid[i].length);
Arrays.sort(arr);
rowDiff[i] = arr[
1
] - arr[
0
];
}
for
(
int
col =
0
; col < grid[
0
].length; col++) {
int
[] arr =
new
int
[grid.length];
for
(
int
i =
0
; i < grid.length; i++) {
arr[i] = grid[i][col];
}
Arrays.sort(arr);
colDiff[col] = arr[
1
] - arr[
0
];
}
}
}