Cod sursa(job #303774)

Utilizator Mishu91Andrei Misarca Mishu91 Data 10 aprilie 2009 13:03:59
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

#define MAX_N 205
#define INF 0x3f3f3f

#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)

int N;
int C[MAX_N][MAX_N], F[MAX_N][MAX_N], Cost[MAX_N][MAX_N];
int Dist[MAX_N], T[MAX_N], viz[MAX_N];
int S, D;
vector <int> G[MAX_N];

void citire()
{
    scanf("%d",&N);

    D = 2*N + 1;
    for(int i = 1; i <= N; ++i)
        for(int j = N+1; j <= 2*N; ++j)
        {
            scanf("%d", Cost[i] + j);
            Cost[j][i] = -Cost[i][j];
            C[i][j] = 1;
            G[i].push_back(j);
            G[j].push_back(i);
        }

    for(int i = 1; i <= N; ++i)
    {
        C[0][i] = C[i+N][D] = 1;
        G[S].push_back(i);
        G[i].push_back(S);

        G[D].push_back(i+N);
        G[i+N].push_back(D);
    }


}

int Bellman()
{
    for(int i = S; i <= D; ++i)
        Dist[i] = INF;
    memset(viz, 0, sizeof viz);

    queue <int> Q;
    Dist[S] = 0;
    viz[S] = 1;
    Q.push(S);

    while(!Q.empty())
    {
        int nod = Q.front();
        viz[nod] = 0;
        Q.pop();

        foreach(G[nod])
        {
            int i = *it;
            if((C[nod][i] - F[nod][i] > 0) && Dist[nod] + Cost[nod][i] < Dist[i])
            {
                Dist[i] = Dist[nod] + Cost[nod][i];
                T[i] = nod;

                if(!viz[i])
                {
                    Q.push(i);
                    viz[i] = 1;
                }
            }
        }
    }

    return (Dist[N] != INF);
}

void flux()
{
    int flow = 0, fmin;
    while(Bellman())
    {
        for(int i = D; i; i = T[i])
            fmin = min(fmin, C[T[i]][i] - F[T[i]][i]);

        for(int i = D; i; i = T[i])
            F[T[i]][i] += fmin,
            F[i][T[i]] -= fmin;

        flow += fmin * Dist[D];
    }

    printf("%d\n",flow);
}

int main()
{
    freopen("cc.in","rt",stdin);
    freopen("cc.out","wt",stdout);

    citire();
    flux();
}