Cod sursa(job #995704)

Utilizator primulDarie Sergiu primul Data 10 septembrie 2013 08:58:03
Problema Pixels Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 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;
}