Cod sursa(job #792185)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 26 septembrie 2012 18:12:17
Problema Pixels Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

ifstream fin("pixels.in");
ofstream fout("pixels.out");

#define maxm 100010
#define maxn 10010

int n, m, x, sol;
struct muchie
{
    int d, cap, per;
} mc[maxm];
vector<int> v[maxn];
int q[maxn], t[maxn], f[maxn];

void addmc(int a, int b, int c1, int c2)
{
    mc[++m].d=b;
    mc[m].cap=c1;
    mc[m].per=m+1;
    v[a].push_back(m);

    mc[++m].d=a;
    mc[m].cap=c2;
    mc[m].per=m-1;
    v[b].push_back(m);
}

int flux()
{
    int q0=1, nod, fiu, muc, fc;
    memset(t, 0, sizeof(t));
    memset(f, 0, sizeof(f));
    q[q0]=0;
    f[0]=maxm;

    for(int i=1; i<=q0; ++i)
    {
        nod=q[i];
        for(int j=0; j<v[nod].size(); ++j)
        {
            muc=v[nod][j];
            fiu=mc[muc].d;
            if(f[fiu]==0 && mc[muc].cap>0)
            {
                q[++q0]=fiu;
                t[fiu]=mc[muc].per;
                f[fiu]=min(f[nod], mc[muc].cap);
            }
        }
    }

    if(f[n]==0)
        return 0;

    for(int i=0; i<v[n].size(); ++i)
    {
        muc=mc[v[n][i]].per;
        nod=mc[v[n][i]].d;

        fc=mc[muc].cap;
        if(fc==0)
            continue;

        while(nod!=0)
        {
            muc=t[nod];
            fc=min(fc, mc[mc[muc].per].cap);
            nod=mc[muc].d;
        }

        if(fc==0)
            continue;

        muc=mc[v[n][i]].per;
        nod=mc[v[n][i]].d;

        mc[muc].cap-=fc;
        mc[mc[muc].per].cap+=fc;

        while(nod!=0)
        {
            muc=t[nod];
            mc[muc].cap+=fc;
            mc[mc[muc].per].cap-=fc;
            nod=mc[muc].d;
        }

        sol-=fc;
    }

    return 1;
}

int main()
{


    fin>>n;
    for(int i=1; i<=n*n; ++i)
    {
        fin>>x;
        addmc(0, i, x, 0);
        sol+=x;
    }
    for(int i=1; i<=n*n; ++i)
    {
        fin>>x;
        addmc(i, n*n+1, x, 0);
        sol+=x;
    }
    for(int i=1; i<=n*n; ++i)
        for(int j=0; j<4; ++j)
        {
            fin>>x;
            if(j==0 && i>n)
                addmc(i, i-n, x, x);
            if(j==3 && i%n!=1)
                addmc(i, i-1, x, x);
        }

    n=n*n+1;

    while(flux());

    fout<<sol;

    return 0;
}