int tot = 0; for( int i = 1; i <= m; ++ i ) a[i] = ++ tot; for( int i = 1; i <= n; ++ i ) b[i] = ++ tot; int S = ++ tot, T = ++ tot;
for( int i = 1; i <= m; ++ i ) A[i] = read( ); for( int i = 1; i <= n; ++ i ) B[i] = read( );
for( int i = 1; i <= m; ++ i ) { for( int j = 1; j <= n; ++ j ) { C[i][j] = read( ); } } // =====
init( tot ); for( int i = 1; i <= m; ++ i ) { add_edge( S, a[i], A[i], 0 ); } for( int i = 1; i <= m; ++ i ) { for( int j = 1; j <= n; ++ j ) { add_edge( a[i], b[j], inf, C[i][j] ); } } for( int i = 1; i <= n; ++ i ) { add_edge( b[i], T, B[i], 0 ); } auto [flow1, mincost] = mincost_maxflow( S, T, tot ); // =====
init( tot ); for( int i = 1; i <= m; ++ i ) { add_edge( S, a[i], A[i], 0 ); } for( int i = 1; i <= m; ++ i ) { for( int j = 1; j <= n; ++ j ) { add_edge( a[i], b[j], inf, -C[i][j] ); } } for( int i = 1; i <= n; ++ i ) { add_edge( b[i], T, B[i], 0 ); } auto [flow2, maxcost] = mincost_maxflow( S, T, tot );