Pagini recente » Cod sursa (job #3147064) | Cod sursa (job #2670232) | Cod sursa (job #1336595) | Cod sursa (job #2805004) | Cod sursa (job #792185)
Cod sursa(job #792185)
#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;
}