class Flow { private: long long int V, E, S, T; long long int *excess; long long int *height; vector *graph; queue active; long long int *positionInAdj; long long int counter; public: Flow(long long int V, long long int E) { Flow::V = V; Flow::E = E; Flow::graph = new vector[Flow::V + 1]; Flow::excess = new long long int[Flow::V + 1]; Flow::height = new long long int[Flow::V + 1]; Flow::positionInAdj = new long long int[Flow::V + 1]; counter = 0; } virtual ~Flow() { delete[] Flow::graph; delete[] Flow::excess; delete[] Flow::height; delete[] Flow::positionInAdj; } void addEdge(long long int from, long long int to, long long int cap); void setSource(long long int S); void setSink(long long int T); void clearPositionInAdj(); long long int getFlow(); void bfs(long long int start); void preFlow(); void relabel(long long int u); void discharge(long long int u); void push(long long int u, Edge &edge); void globalRelabeling(); };