#include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(disable:4996) typedef long long ll; #define MIN(a, b) ((a)>(b)? (b): (a)) #define MAX(a, b) ((a)<(b)? (b): (a)) #define LINF 9223300000000000000 #define INF 2140000000 const long long MOD = 1000000007; //const long long MOD = 998244353; using namespace std; struct Edge{ int to, cap, rev; Edge(int t, int c, int r):to(t), cap(c), rev(r) {} }; void AddEdge(int fr, int to, int cap, vector >& gr) { gr[fr].push_back( Edge(to, cap, gr[to].size()) ); gr[to].push_back( Edge(fr, 0, gr[fr].size()-1) ); } int dfs(int v, int G, int f, vector >& gr, vector& used ) { if(v==G) return f; used[v]=1; auto it = gr[v].begin(); for(; it!=gr[v].end(); ++it) { if(!used[it->to] && it->cap>0) { int d = dfs( it->to, G, MIN(f, it->cap), gr, used); if(d>0) { it->cap -= d; gr[it->to][it->rev].cap += d; return d; } } } return 0; } int max_flow( int S, int G, vector >& g) { int flow=0; while(1) { vector used(g.size(), 0); int f = dfs(S, G, INF, g, used); if(f==0) break; flow += f; } return flow; } int main(int argc, char* argv[]) { int h,w; scanf("%d%d", &h, &w); ll sum=0; int m=h+w+h*w; vector > gr(m+2); int i,j; for(i=0; i