Cod sursa(job #51185)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 10 aprilie 2007 13:18:06
Problema Cc Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <stdio.h>
#define NMAX 202
#define CMAX (1<<14)
#define INF 666666

int A[NMAX][NMAX], N;
int F[NMAX][NMAX], InQ[CMAX], Q[CMAX], C[NMAX][NMAX], CM, D[NMAX];
int cup[NMAX];

void flux(int sursa)
{
        int p1 = 0, p2 = 1, i, j, nod, tata[NMAX], tip[NMAX], min;

        for (i = 0; i < NMAX; i++)
            D[i] = INF, InQ[i] = tata[i] = tip[i] = 0;

        Q[p1] = sursa;
        D[ sursa ] = 0;
        InQ[ sursa ] = 1;

        while (p1 != (p2+1)&(CMAX-1))
        {
                nod = Q[p1];
                
                if (nod <= N)
                {
                   for (i = N+1; i <= 2*N; i++)
                       if (F[nod][i] == 0 && D[i] > D[nod]+C[nod][i])
                       {
                                D[i] = D[nod]+C[nod][i];
                                tata[i] = nod;
                                if (!InQ[i])
                                {
                                        InQ[i] = 1;
                                        Q[p2] = i;
                                        p2 = (p2+1)&(CMAX-1);
                                }
                       }
                }
                else
                {
                        if (cup[nod] > 0 && (D[cup[nod]] > D[nod]-C[cup[nod]][nod]))
                        {
                                D[cup[nod]] = D[nod]-C[cup[nod]][nod];
                                tata[cup[nod]] = nod;
                                tip[cup[nod]] = 1;
                                if (!InQ[cup[nod]])
                                {
                                        InQ[cup[nod]] = 1;
                                        Q[p2] = cup[nod];
                                        p2 = (p2+1)&(CMAX-1);
                                }
                        }
                }
                InQ[nod] = 0;
                p1 = (p1+1)&(CMAX-1);
        }

        j = 0;
        min = INF;
        for (i = N+1; i <= 2*N; i++)
            if (cup[i] == 0 && min > D[i]) j = i, min = D[i];

        CM += min;

        while (tata[j] > 0)
        {
                if (tip[j] == 0)
                {
                        F[tata[j]][j]++;
                        cup[j] = tata[j];
                }
                else
                    F[j][tata[j]]--;
                    
                j = tata[j];
        }
        
}

int main()
{
        int i, j, f, p1, p2, nod;

        freopen("cc.in", "r", stdin);
        scanf("%d", &N);

        for (i = 1; i <= N; i++)
            for (j = 1; j <= N; j++) scanf("%d", &C[i][N+j]);

        for (i = 1; i <= N; i++) flux(i);

        freopen("cc.out", "w", stdout);
        printf("%d\n", CM);

        return 0;
        
}