#pragma once #include #include #include using namespace std; template class Matrix{ vector> mat; //list of rows int W=0,H=0; public: template class RowAccess{ vector &row; public: RowAccess(vector &row):row(row){} T& operator[](int x){return row[x];} const T& operator[](int x) const {return row[x];} T& front(){return row.front();} const T& front() const {return row.front();} T& back(){return row.back();} const T& back() const {return row.back();} }; template class ConstRowAccess{ const vector &row; public: ConstRowAccess(const vector &row):row(row){} const T& operator[](int x) const {return row[x];} const T& front() const {return row.front();} const T& back() const {return row.back();} }; Matrix() = default; Matrix(int W,int H) :W(W),H(H){ mat.resize(H); for(auto &row : mat){ row.resize(W); } } void addrow(){ mat.emplace_back(W,T()); H++; } void addcolumn(){ for(auto &row : mat){ row.emplace_back(); } W++; } void resize(int w,int h){ if(hH){ mat.resize(h); for(int i=H;i operator[](int y){ return RowAccess(mat[y]); } ConstRowAccess operator[](int y) const { return ConstRowAccess(mat[y]); } int width() const {return W;} int height() const {return H;} }; class Problem{ enum VarType{ VT_NORMAL=0, VT_SLACK, VT_ART, }; vector vartype; vector zfunc; double zvalue=0; Matrix restr; vector bvec; vector basis; void removefrombasis(int varidx); void solve_noart(); public: Problem(const Problem&) = default; Problem(istream &in); void solve(); double solutionValue() const; vector solutionVars() const; friend istream& operator>>(istream &in,Problem &prob); friend ostream& operator<<(ostream &os,const Problem &prob); }; istream& operator>>(istream &in,Problem &prob); ostream& operator<<(ostream &os,const Problem &prob);