#include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <fstream>
#include <map>
#include <set>
#include <ctime>
#include <memory>
#include <thread>
#include <chrono>
#include <random>
#include <regex>
#include <fstream>
#include <array>
#include <iostream>
#include <vector>
#include <iomanip>
#include <limits>
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
class Simplex {
private:
vector<vector<double>> tableau;
int numConstraints;
int numVariables;
public:
Simplex(int variables, int constraints,
const vector<vector<double>>& A,
const vector<double>& B,
const vector<double>& C) {
numVariables = variables;
numConstraints = constraints;
// Initialize tableau: rows = constraints + 1, cols = variables + slack + RHS
tableau.resize(constraints + 1, vector<double>(variables + constraints + 1, 0.0));
// Fill constraint rows
for (int i = 0; i < constraints; ++i) {
for (int j = 0; j < variables; ++j) {
tableau[i][j] = A[i][j];
}
tableau[i][variables + i] = 1.0; // slack variable
tableau[i].back() = B[i];
}
// Fill objective function (negate for maximization)
for (int j = 0; j < variables; ++j) {
tableau[constraints][j] = -C[j];
}
}
void printTableau() {
cout << fixed << setprecision(2);
for (const auto& row : tableau) {
for (double val : row) {
cout << setw(10) << val << " ";
}
cout << endl;
}
cout << endl;
}
void solve() {
while (true) {
int pivotCol = -1;
double minValue = 0;
// Find entering variable (most negative)
for (int j = 0; j < tableau[0].size() - 1; ++j) {
if (tableau[numConstraints][j] < minValue) {
minValue = tableau[numConstraints][j];
pivotCol = j;
}
}
if (pivotCol == -1) break; // Optimal
// Find leaving variable
int pivotRow = -1;
double minRatio = 1e9;
for (int i = 0; i < numConstraints; ++i) {
if (tableau[i][pivotCol] > 0) {
double ratio = tableau[i].back() / tableau[i][pivotCol];
if (ratio < minRatio) {
minRatio = ratio;
pivotRow = i;
}
}
}
if (pivotRow == -1) {
cout << "Unbounded solution." << endl;
return;
}
// Pivot
double pivot = tableau[pivotRow][pivotCol];
for (double& val : tableau[pivotRow])
val /= pivot;
for (int i = 0; i <= numConstraints; ++i) {
if (i != pivotRow) {
double factor = tableau[i][pivotCol];
for (int j = 0; j < tableau[0].size(); ++j) {
tableau[i][j] -= factor * tableau[pivotRow][j];
}
}
}
cout << "Tableau after pivot:\n";
printTableau();
}
cout << "Optimal value of Z = " << tableau[numConstraints].back() << endl;
}
};
int main() {
int variables, constraints;
cout << "Enter number of variables: ";
cin >> variables;
cout << "Enter number of constraints: ";
cin >> constraints;
vector<vector<double>> A(constraints, vector<double>(variables));
vector<double> B(constraints);
vector<double> C(variables);
cout << "\nEnter coefficients of constraints (A matrix):\n";
for (int i = 0; i < constraints; ++i) {
cout << "Constraint " << i + 1 << ": ";
for (int j = 0; j < variables; ++j) {
cin >> A[i][j];
}
}
cout << "\nEnter right-hand side (B vector):\n";
for (int i = 0; i < constraints; ++i) {
cout << "B[" << i + 1 << "]: ";
cin >> B[i];
}
cout << "\nEnter coefficients of the objective function (C vector):\n";
for (int j = 0; j < variables; ++j) {
cout << "C[" << j + 1 << "]: ";
cin >> C[j];
}
Simplex solver(variables, constraints, A, B, C);
cout << "\nInitial Tableau:\n";
solver.printTableau();
solver.solve();
return 0;
}
/* /\_/\
* (= ._.)
* / > \>
*/