Cod sursa(job #1525)

Utilizator dominoMircea Pasoi domino Data 13 decembrie 2006 22:46:15
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 205
#define INF 0x3f3f3f3f
#define FIN "cc.in"
#define FOUT "cc.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)

int N, src, dest, Res, C[MAX_N][MAX_N], D[MAX_N], V[MAX_N], up[MAX_N];
char R[MAX_N][MAX_N], U[MAX_N];

int augment(void)
{
    int i, min, pos;

    memset(U, 0, sizeof(U));
    memset(D, 0x3f, sizeof(D));
    D[src] = 0;

    while (1)
    {
        min = INF, pos = -1;
        FOR (i, 0, dest+1) 
            if (min > D[i] && !U[i])
                min = D[i], pos = i;
        if (pos == -1) break;

        U[pos] = 1;
        FOR (i, 0, dest+1)
            if (D[i] > D[pos]+C[pos][i]+V[pos]-V[i] && R[pos][i] > 0)  
                D[i] = D[pos]+C[pos][i]+V[pos]-V[i], up[i] = pos;
    }
    FOR (i, 0, dest+1) V[i] += D[i];

    return D[dest] != INF;
}

int main(void)
{
    int i, j;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &N);
    FOR (i, 1, N+1) FOR (j, N+1, (N<<1)+1)
    {
        scanf("%d", C[i]+j);
        C[j][i] = -C[i][j];
        R[i][j] = 1;
    }

    src = 0; dest = (N<<1)+1;
    FOR (i, 1, N+1) R[src][i] = 1;
    FOR (i, N+1, (N<<1)+1) R[i][dest] = 1;

    while (augment())
    {
        for (i = dest; i != src; i = up[i])
            R[up[i]][i]--, R[i][up[i]]++;
        Res += V[dest];
    }

    printf("%d\n", Res);

    return 0;
}