Cod sursa(job #360265)
#include <algorithm>
#include <vector>
using namespace std;
#define DIM ( 1<<8 )
#define INF ( 1<<30 )
#define pb push_back
#define sz size()
int n, rez, cd[ DIM*DIM ], tat[ DIM ], val[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ], flx[ DIM ][ DIM ];
int S, D;
vector< int > vec[ DIM ];
void init_tat() {
int i;
for( i = 0; i <= 2*n+1; ++i )
tat[ i ] = -1;
}
void init_val() {
int i;
for( i = 0; i <= 2*n+1; ++i )
val[ i ] = INF;
}
void init_viz() {
int i;
for( i = 0; i <= 2*n+1; ++i )
viz[ i ] = 0;
}
int bellman_ford() {
int st, dr, aux, nod;
unsigned int i;
init_tat();
init_val();
init_viz();
cd[ 0 ] = S;
val[ S ] = 0;
viz[ S ] = 1;
for( st = dr = 0; st <= dr; ++st ) {
nod = cd[ st ];
viz[ nod ] = 0;
for( i = 0; i < vec[ nod ].sz; ++i ) {
aux = vec[ nod ][ i ];
if( val[ nod ] + cst[ nod ][ aux ] < val[ aux ] && flx[ nod ][ aux ] > 0 ) {
if( !viz[ aux ] ) {
viz[ aux ] = 1;
cd[ ++dr ] = aux;
}
val[ aux ] = val[ nod ] + cst[ nod ][ aux ];
tat[ aux ] = nod;
}
}
}
if( val[ D ] != INF )
return 1;
return 0;
}
void read() {
int i, j, cst0;
scanf( "%d", &n );
S = 0;
D = 2*n+1;
for( i = 1; i <= n; ++i ) {
vec[ S ].pb( i );
vec[ i ].pb( S );
flx[ S ][ i ] = 1;
for( j = 1; j <= n; ++j ) {
scanf( "%d", &cst0 );
cst[ i ][ j+n ] = cst0;
cst[ j+n ][ i ] = -cst0;
flx[ i ][ j+n ] = 1;
vec[ i ].pb( j+n );
vec[ j+n ].pb( i );
}
}
}
void solve() {
int i, nod, fmin;
for( i = n+1; i <= 2*n; ++i ) {
vec[ i ].pb( D );
vec[ D ].pb( i );
flx[ i ][ D ] = 1;
}
while( bellman_ford() ) {
fmin = INF;
for( nod = D; nod != S; nod = tat[ nod ] )
fmin = min( fmin, flx[ tat[ nod ] ][ nod ] );
for( nod = D; nod != S; nod = tat[ nod ] ) {
flx[ tat[ nod ] ][ nod ] -= fmin;
flx[ nod ][ tat[ nod ] ] += fmin;
}
rez += fmin*val[ D ];
}
printf( "%d", rez );
}
int main() {
freopen( "cc.in", "r", stdin );
freopen( "cc.out", "w", stdout );
read();
solve();
return 0;
}