Cod sursa(job #5314)

Utilizator mariusdrgdragus marius mariusdrg Data 11 ianuarie 2007 19:43:07
Problema Cc Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<stdio.h>
#define maxn 500
#define inf 1e9

int co[maxn],a[maxn][maxn],i,n,j,k;
int f[maxn][maxn],c[maxn][maxn],pr[maxn];
int d,s,x,x1;


void init()
{

    co[0]=0;
    for(i=1;i<=2*n+1;i++)
        {
            pr[i]=0;
            co[i]=inf;
        }
}


int dr()
{

    int i,j,k,ver=1;
    init();
    for(i=0;i<=2*n+1;i++)
        {
        ver=1;
        for(j=0;j<=2*n+1;j++)
            for(k=0;k<=2*n+1;k++)
            if (c[j][k]-f[j][k]>0)
            {
                if (f[j][k]<0)
                    {
                    if (co[k]>co[j]+f[j][k]*a[j][k])
                        {
                        co[k]=co[j]+f[j][k]*a[j][k];
                        pr[k]=j;
                        ver=0;
                        }
                    }
                    else
                    {
                    if (co[k]>co[j]+(c[j][k]-f[j][k])*a[j][k])
                        {
                        co[k]=co[j]+(c[j][k]-f[j][k])*a[j][k];
                        pr[k]=j;
                        ver=0;
                        }
                    }

            }
         if (ver==1) break;
         }
    for(i=1;i<=2*n+1;i++)
        if (co[d]<co[pr[d]]||co[d]==inf) return 0;
    return d;
}


int main()
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=n+1;j<=2*n;j++)
        {
            scanf("%d",&a[i][j]);
            if (a[i][j]==0) a[i][j]=inf;
            a[j][i]=a[i][j];
        }
    s=0;
    d=2*n+1;
    for(i=1;i<=n;i++)
        for(j=n+1;j<=2*n;j++)
        {
            c[i][j]=1;
        }
    for(i=1;i<=n;i++)
        {
        c[0][i]=1;
        c[n+i][2*n+1]=1;
        }
    x=1;
    while (x!=0)
    {
        x=dr();
        x1=x;
        while(x)
        {
            f[x][pr[x]]--;
            f[pr[x]][x]++;
            x=pr[x];
        }
        x=x1;
    }
    int sum=0;
    for(i=1;i<=2*n+1;i++)
        for(j=1;j<=2*n+1;j++)
            if (f[i][j]>0)sum+=f[i][j]*a[i][j];
    printf("%d",sum);
    return 0;


}