Cod sursa(job #1473)

Utilizator filipbFilip Cristian Buruiana filipb Data 13 decembrie 2006 19:21:49
Problema Cc Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2 kb
#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;
}