Cod sursa(job #1921)

Utilizator astronomyAirinei Adrian astronomy Data 15 decembrie 2006 13:11:34
Problema Cc Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#include <string.h>

#define MAXN 256
#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;
}