Pagini recente » Cod sursa (job #3141545) | Ciorna | Cod sursa (job #1576544) | Cod sursa (job #1503314) | Cod sursa (job #161779)
Cod sursa(job #161779)
#include <cstdio>
#include <cstring>
#include <list>
using namespace std;
const int MAX = 105;
int C[MAX][MAX], F[MAX][MAX];
int T[MAX], D[MAX];
int n,i,j;
struct elem {
int x,y,c;
elem(int a, int b, int d) { x=a, y=b, c=d; }
};
list<elem> L;
int bf() {
memset(D, 0x3f, sizeof(D));
D[0] = 0;
int ok, nr, l=L.size();
list<elem>::iterator it;
for (ok=nr=1; ok && nr<2*n; ++nr)
for (ok=0, it=L.begin(); it!=L.end(); ++it) {
int i = it->x, j = it->y, c = it->c;
if ( C[i][j]>F[i][j] && D[j]>D[i]+c )
D[j] = D[i]+c, T[j] = i, ok=1;
if ( C[j][i]>F[j][i] && D[i]>D[j]-c )
D[i] = D[j]-c, T[i] = j, ok=1;
}
return D[2*n+1] < 0x3f3f3f3f;
}
int flux() {
int f,c;
for (f=c=0; bf(); f++, c += D[2*n+1]) {
for (i=2*n+1; i; i=T[i])
F[T[i]][i] ++, F[i][T[i]] --;
memset(T, 0, sizeof(T));
}
return c;
}
int main() {
freopen("cc.in", "r", stdin);
scanf("%d", &n);
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j) {
int x;
scanf("%d", &x);
L.push_back(elem(i, n+j, x));
}
for (i=1; i<=n; ++i) {
C[0][i] = C[n+i][2*n+1] = 1;
L.push_back(elem(0, i, 0));
L.push_back(elem(n+i, 2*n+1, 0));
for (j=1; j<=n; ++j)
C[i][n+j] = 1;
}
fprintf(fopen("cc.out","w"), "%d\n", flux());
return 0;
}