Cod sursa(job #299782)

Utilizator mihai0110Bivol Mihai mihai0110 Data 6 aprilie 2009 23:26:43
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>
#include<vector>
#define MAXN 220
#define INF 1000000
#define pb push_back
#define sz size
#define S 205
#define D 206

using namespace std;

int n,i,j,fmin,x,sol;
int cost[MAXN][MAXN],c[MAXN][MAXN];
int tata[MAXN],dist[MAXN];
vector <int> a[MAXN];

int bf()
{
    int i,p,u,X,Y;
    int Q[MAXN*10],inq[MAXN];
    for(i=0;i<=D;i++)
    {
        dist[i]=INF;
        inq[i]=0;
        tata[i]=0;
    }
    p=u=1;
    Q[1]=S;
    dist[S]=0;
    tata[S]=S;
    inq[S]=1;
    for(;p<=u;p++)
    {
        X=Q[p];
        for(i=0;i<a[X].size();i++)
        {
            Y=a[X][i];
            if(c[X][Y] && dist[X] + cost[X][Y] < dist[Y])
            {
                dist[Y] = dist[X] + cost[X][Y];
                tata[Y] = X;
                if(!inq[Y])
                {
                    Q[++u]=Y;
                    inq[Y]=1;
                }
            }
        }
        inq[X]=0;
    }
    if(dist[D]!=INF)
        return 1;
    return 0;
}

int main(void)
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        a[S].pb(i);
        a[i].pb(S);
        c[S][i]=1;
        for(j=n+1;j<=2*n;j++)
        {
            scanf("%d",&cost[i][j]);
            cost[j][i] -= cost[i][j];
            c[i][j]=1;
            a[i].pb(j);
            a[j].pb(i);
        }
    }
    for(i=n+1;i<=2*n;i++)
    {
        c[i][D]=1;
        a[D].pb(i);
        a[i].pb(D);
    }
    while(bf())
    {
        fmin=INF;
        x=D;
        while(x!=S)
        {
            fmin=min(fmin, c[tata[x]][x]);
            x=tata[x];
        }
        x=D;
        while(x!=S)
        {
            c[tata[x]][x]-=fmin;
            c[x][tata[x]]+=fmin;
            x=tata[x];
        }
        sol+=fmin*dist[D];
    }
    printf("%d\n",sol);
    return 0;
}