Cod sursa(job #593564)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 3 iunie 2011 14:44:38
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.65 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<cstring>
#include<stdio.h>
#include<math.h>

#define inf 1000000000

using namespace std;


vector<int> v[1000];

int flux[500][500],cap[500][500],n,C[100000],sol,S,D,sw[1000],dist[1000],t[1000];

int a[1000]={0, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262,  1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262, 1243, 1235, 43263, 1210, 20, 1552, 12442, 21255, 65323, 3262 } ;

int fluxm()
{
    int p,i,x,mx,u,val;
    vector <int> :: iterator it;
    p=u=1;
    C[p]=S;
    memset(sw,0,sizeof(sw));
    memset(t,0,sizeof(t));
    sw[0]=1;
    for (i=1;i<=D;i++)
        dist[i]=inf;
    dist[S]=0;

    while (p<=u)
    {
        x=C[p];
        for (it=v[x].begin();it<v[x].end();++it)
            if (cap[x][*it]>flux[x][*it])
                if (dist[x]+(flux[x][*it]>=0)<=dist[*it])
                {
                    t[*it]=x;
                    dist[*it]=dist[x]+(flux[x][*it]>=0);
                    if (sw[*it]==0)
                    {
                        sw[*it]=1;
                        C[++u]=*it;
                    }
                }
        sw[x]=0;
        ++p;
    }

    mx=inf;
    for (i=D;i>S;i=t[i])
    {
        if (flux[t[i]][i]<0)
            val=-flux[t[i]][i];
        else
            val=cap[t[i]][i]-flux[t[i]][i];
        mx=min(mx,val);
    }

    for (i=D;i>S && dist[D]!=inf;i=t[i])
    {
        flux[t[i]][i]+=mx;
        flux[i][t[i]]-=mx;
    }
    sol+=mx*(dist[D]-2);
    return mx;
}

void get ()
{
    int cost=1;
    while (cost)
        cost=fluxm();
}

void cstgraf()
{

    int i,s=0;
    S=0;D=n+2;
    for (i=1;i<=n;i++)
    {
        s+=a[i];
        if (a[i]>0)
            cap[S][i]=a[i],v[S].push_back(i);
        if (a[i]<0)
            cap[i][D]=-a[i],v[i].push_back(D);
        v[i].push_back(i+1);
        v[i+1].push_back(i);
        cap[i][i+1]=cap[i+1][i]=inf;
    }
    if (s>0)
        v[n+1].push_back(D),cap[n+1][D]=s;
    else
        v[S].push_back(n+1),cap[S][n+1]=-s;
    v[n+1].push_back(1);
    v[1].push_back(n+1);
    cap[1][n+1]=cap[n+1][1]=inf;
}


void citire()
{
    int i;

    ifstream f("fluxm.in");
    f>>n;
    for (i=1;i<=n;++i)
        f>>a[i];

    f.close();
}


void afisare()
{
    ofstream g("fluxm.out");
    cout<<sol<<' ';
    g.close();
}

int main()
{
    n=300;
    for (int i=1;i<=128;++i)
    {cstgraf();
    get();
    afisare();
    memset(flux,0,sizeof(flux));
    memset(cap,0,sizeof(cap));
    for (int j=0;j<=D;++j)
        vector<int>().swap(v[j]);
    for (int j=1;j<=n;++j)
        a[j]--;
        sol=0;
    }
    return 0;
}