Pagini recente » Cod sursa (job #977807) | Cod sursa (job #3288259) | Cod sursa (job #488141) | Cod sursa (job #2884814) | Cod sursa (job #1919)
Cod sursa(job #1919)
#include <stdio.h>
#include <string.h>
#define MAXN 1024
#define INF (1 << 29)
int N;
int A[MAXN][MAXN], cost[MAXN][MAXN], d[MAXN];
int C[MAXN][MAXN], F[MAXN][MAXN], from[MAXN];
int src, dest;
int bfs(void)
{
int i, j, k, ok, x;
for(i = src; i <= dest; i++)
d[i] = INF, from[i] = -1;
d[src] = 0, ok = 1;
for(k = src; k <= dest && ok; k++)
for(ok = 0, i = src; i <= dest; i++)
for(j = src; j <= dest; j++)
if(C[i][j]-F[i][j] > 0)
{
if(F[i][j] == 0 && d[j] > d[i]+cost[i][j])
ok = 1, d[j] = d[i]+cost[i][j], from[j] = i;
if(F[i][j] == -1 && d[j] > d[i]-cost[i][j])
ok = 1, d[j] = d[i]-cost[i][j], from[j] = i;
}
if(from[dest] == -1) return 0;
for(x = dest; from[x] > -1; x = from[x])
F[from[x]][x]++, F[x][from[x]]--;
return 1;
}
int solve(void)
{
int res = 0, i, j;
while( bfs() )
;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
if(F[i][N+j] == 1)
res += cost[i][N+j];
return res;
}
int main(void)
{
freopen("cc.in", "rt", stdin);
freopen("cc.out", "wt", stdout);
int i, j;
scanf("%d\n", &N), src = 0, dest = 2*N+1;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
scanf("%d ", &A[i][j]),
C[i][N+j] = 1, cost[i][N+j] = cost[N+j][i] = A[i][j];
for(i = 1; i <= N; i++)
C[src][i] = 1, C[i+N][dest] = 1;
printf("%d\n", solve());
return 0;
}