Cod sursa(job #731859)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 9 aprilie 2012 12:29:06
Problema Pixels Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#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()
{
    freopen("pixels.in", "r", stdin);
    freopen("pixels.out", "w", stdout);

    scanf("%d", &n);
    for(int i=1; i<=n*n; ++i)
    {
        scanf("%d", &x);
        addmc(0, i, x, 0);
        sol+=x;
    }
    for(int i=1; i<=n*n; ++i)
    {
        scanf("%d", &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)
        {
            scanf("%d", &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());

    printf("%d\n", sol);

    return 0;
}