Cod sursa(job #935466)

Utilizator rudarelLup Ionut rudarel Data 3 aprilie 2013 15:10:36
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 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;
}