Cod sursa(job #1435384)

Utilizator alexandru.jercaianuJercaianu Alexandru alexandru.jercaianu Data 12 mai 2015 23:20:26
Problema Cc Scor 0
Compilator cpp Status done
Runda mixxx_phaser Marime 2.43 kb
#include<stdio.h>
#include<iomanip.h>
#include<math.h>
#define MAX 204

typedef struct nod{
    int info;
    nod*urm;
}*PNOD,NOD;
PNOD l[204];

int f[MAX][MAX],c[MAX][MAX],cost[MAX][MAX];
int tata[MAX];
int d[MAX];
int n;

void citire();
void add(int ,int );
void solve();
void drum();
void afisare();
int bellmand();
int minimizeaza();

int main()
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);

    citire();
    solve();
    afisare();

    return 0;

}
void citire()
{
    int i,j,x;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%d",&x);
            add(i,j+n);
            add(j+n,i);
            c[i][j+n]=1;
            cost[i][j+n]=cost[j+n][i]=x;

            //printf("%d ",x);
            //printf("\n");
        }
    }
    for(i=1;i<=n;i++)
    {
        add (0,i);
        add(i,0);
        c[0][i]=1;
        cost[0][i]=0;
    }
    for(i=n+1;i<=n+n;i++)
    {
        add(i,n+n+1);
        add(n+n+1,i);
        c[i][n+n+1]=1;

    }

    //PNOD p;
    //for(p=l[n+n+1];p;p=p->urm)
    //printf("%d ",p->info);
}
void add(int i,int j)
{
    PNOD p=new NOD;
    p->info=j;
    p->urm=l[i];
    l[i]=p;
}
void solve()
{
    while(bellmand())
        drum();
}
int bellmand()
{
    int i;
    for(i=0;i<=n+n+1;i++)
    {
        d[i]=2000000;
        tata[i]=0;
    }
    d[0]=0;
    for(i=0;i<n+n+1;i++)
        if(!minimizeaza())
            break;

    if(d[n+n+1]==2000000)
        return 0;
    return 1;
}
int minimizeaza()
{

    int i,j,ok;
    ok=0;

    for(i=0;i<=n+n+1;i++)
        for(PNOD p=l[i];p;p=p->urm)
        {
            j=p->info;
            if(c[i][j]>f[i][j])
                if(d[j]>d[i]+cost[i][j])
                {
                    d[j]=d[i]+cost[i][j];
                    tata[j]=i;
                    ok=1;
                }
            if(f[j][i])
                if(d[j]>d[i]-cost[i][j])                                               
                {
                    d[j]=d[i]-cost[i][j];
                    tata[j]=-i;
                    ok=1;
                }
        }
    return ok;
}
void drum()
{
    int i,j;
    i=n+n+1;
    while(i)
    {
        j=abs(tata[i]);
        if(tata[i]>=0)  f[j][i]+=1;
        else
            f[i][j]-=1;
        i=j;
    }
}

void afisare()
{
    int i,j,sol;
    sol=0;
    for(i=0;i<=n;i++)
        for(j=n+1;j<=n+n;j++)
            if(f[i][j])
                sol+=cost[i][j];

    printf("%d",sol);
}