Pagini recente » Cod sursa (job #656718) | Cod sursa (job #3248250) | Cod sursa (job #2061547) | Cod sursa (job #1355934) | Cod sursa (job #1473)
Cod sursa(job #1473)
#include <stdio.h>
#define INF 2000000001
#define NMax 205
int N, cst[NMax][NMax], F[NMax][NMax], Up[NMax], S, D, q[NMax * NMax];
int G[NMax][NMax], C[NMax][NMax], deg[NMax], d[NMax], bst = 0;
int modul(int X)
{ if (X < 0) return -X; return X; }
void BS(int S, int D)
{
int i, ql, qr, nd;
for (i = S; i <= D; i++) d[i] = INF;
for (q[qr = ql = 0] = S, d[S] = 0; qr <= ql; qr++)
{
nd = q[qr];
for (i = 1; i <= deg[nd]; i++)
if (F[nd][G[nd][i]] < C[nd][G[nd][i]] &&
d[G[nd][i]] > d[nd] + cst[nd][G[nd][i]])
q[++ql] = G[nd][i],
d[G[nd][i]] = d[nd] + cst[nd][G[nd][i]],
Up[G[nd][i]] = nd;
}
}
int main(void)
{
int i, j;
freopen("cc.in", "r", stdin);
freopen("cc.out", "w", stdout);
scanf("%d", &N);
S = 0; D = 2*N+1;
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
scanf("%d", &cst[i][N+j]);
for (i = 1; i <= N; i++)
G[S][++deg[S]] = i, G[D][++deg[D]] = N+i,
C[S][i] = 1, C[N+i][D] = 1;
for (i = 1; i <= N; i++)
G[i][++deg[i]] = S, G[N+i][++deg[N+i]] = D;
for (i = 1; i <= N; i++)
for (j = N+1; j <= 2*N; j++)
G[i][++deg[i]] = j, G[j][++deg[j]] = i,
C[i][j] = 1;
for (j = 1; j <= N; j++)
{
BS(S, D);
for (i = D; i != S; i = Up[i])
{
F[Up[i]][i]++, F[i][Up[i]]--;
if (F[Up[i]][i] == F[i][Up[i]])
cst[Up[i]][i] = cst[i][Up[i]] = modul(cst[i][Up[i]]);
else
cst[Up[i]][i] = modul(cst[Up[i]][i]),
cst[i][Up[i]] = -cst[Up[i]][i];
}
}
for (i = 1; i <= N; i++)
for (j = N+1; j <= 2*N; j++)
if (F[i][j] > 0)
bst += F[i][j] * cst[i][j];
printf("%d\n", bst);
return 0;
}