Cod sursa(job #606661)

Utilizator crushackPopescu Silviu crushack Data 6 august 2011 23:01:38
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <string.h>
#include <queue>
#include <bitset>
#include <algorithm>
#define NMax 110
#define INF 0x3f3f3f3f
using namespace std;

const char IN[]="cc.in",OUT[]="cc.out";

int N;
bool done=false;
int Cos[NMax][NMax] , C[NMax][NMax] , F[NMax][NMax] , T[2*NMax] , P[2*NMax];

int BellmanFord()
{
    int i,x;
    bitset<NMax> v;
    queue<int> qu;

    qu.push(0);
    memset(T,0x3f,sizeof(T));
    T[0]=0;v[0]=true;
    while (!qu.empty())
    {
        x=qu.front();qu.pop();

        for (i=0;i<=2*N+1;++i) if (C[x][i]>F[x][i] && Cos[x][i]+T[x]<T[i])
        {
            T[i]=Cos[x][i]+T[x];
            P[i]=x;
            if (!v[i]) v[i]=true,qu.push(i);
        }
        v[x]=false;
    }
    return T[2*N+1]!=INF;

}

int flux()
{
    int ret=0,x,fmin;

    while (BellmanFord())
    {
        fmin=INF;
        for (x=2*N+1;x;x=P[x])
            fmin=min(fmin,C[P[x]][x]-F[P[x]][x]);

        for (x=2*N+1;x;x=P[x])
            F[P[x]][x]+=fmin,
            F[x][P[x]]-=fmin;

        ret+=T[2*N+1]*fmin;
    }
    return ret;
}

int main()
{
    int i,j;
    freopen(IN,"r",stdin);
    scanf("%d",&N);
    for (i=1;i<=N;++i)
        for (j=1;j<=N;++j)
            scanf("%d",&Cos[i][N+j]),Cos[N+j][i]=-Cos[i][N+j],
            C[i][N+j]=1;
    fclose(stdin);

    for (i=1;i<=N;++i) C[0][i]=1;
    for (i=N+1;i<=2*N;++i) C[i][2*N+1]=1;

    freopen(OUT,"w",stdout);
    printf("%d\n",flux());
    fclose(stdout);

    return 0;
}