Pagini recente » Cod sursa (job #2494285) | Cod sursa (job #1650070) | Cod sursa (job #2936150) | Cod sursa (job #2284308) | Cod sursa (job #541241)
Cod sursa(job #541241)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N = 205;
const int INF = 0x3f3f3f3f;
int a[N][N], g[N][N], c[N][N], n, S, D, f[N][N];
queue<int> q;
int BELLMAN_FORD() {
int i, k, r;
int v[N], cmin[N], t[N];
for(i = S; i <= D; ++i) {
v[i] = t[i] = 0;
cmin[i] = INF;
}
v[S] = 1;
cmin[S] = 0;
q.push(S);
while(!q.empty()) {
k = q.front();
for(i = 1; i <= D; ++i)
if( a[k][i] && f[k][i] < c[k][i] && cmin[k] + g[k][i] < cmin[i]) {
cmin[i] = cmin[k] + g[k][i];
t[i] = k;
if(!v[i]) {
q.push(i);
v[i] = 1;
}
}
v[k] = 0;
q.pop();
}
if(cmin[D] != INF) {
r = INF;
k = D;
while(k != S) {
r = min(r, c[t[k]][k] - f[t[k]][k]);
k = t[k];
}
k = D;
while(k != S) {
f[k][t[k]] -= r;
f[t[k]][k] += r;
k = t[k];
}
return cmin[D] * r;
}
return 0;
}
int main() {
freopen("cc.in", "r", stdin);
freopen("cc.out", "w", stdout);
int i, j;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
scanf("%d", &g[i][j + n]), g[j + n][i] = -g[i][j + n];
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
a[i][n + j] = 1, a[n + j][i] = 1, c[i][n + j] = 1;
S = 0;
D = 2 * n + 1;
for(i = 1; i <= n; ++i)
a[S][i] = 1, a[i][S] = 1, c[S][i] = 1, a[n + i][D] = 1, a[D][n + i] = 1, c[n + i][D] = 1;
int x = 1, s = 0;
while(x) {
x = BELLMAN_FORD();
s += x;
}
printf("%d\n", s);
return 0;
}