Cod sursa(job #561485)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 20 martie 2011 16:06:37
Problema Pixels Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <stdio.h>
#include <string.h>
#include <ext/hash_map>
#include <vector>
#include <queue>
#define Nmax 10005
#define pii pair< int,int >
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define INF 2147000000
#define itt vector< pii >::iterator
using namespace std;
using namespace __gnu_cxx;

int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};
int Q[Nmax];
vector< int > v[Nmax],F[Nmax],C[Nmax];
int prev[Nmax],sz[Nmax],vv[Nmax];
int N,S,D,sol;
hash_map <int,int> H[Nmax];

inline int Minim(int x,int y){ return x<y ? x:y;}

void citire(){
    int x,i,j,ii,jj,k;
    scanf("%d",&N);
    S=N*N+2; D=N*N+1;

    for(i=1;i<=N*N;++i){
        scanf("%d",&x); sol+=x;
        v[S].pb(i); C[S].pb(x); F[S].pb(0); H[S][i]=sz[S]++;
        v[i].pb(S); C[i].pb(0); F[i].pb(0); H[i][S]=sz[i]++;
    }
    for(i=1;i<=N*N;++i){
        scanf("%d",&x); sol+=x;
        v[i].pb(D); C[i].pb(x); F[i].pb(0); H[i][D]=sz[i]++;
        v[D].pb(i); C[D].pb(0); F[D].pb(0); H[D][i]=sz[D]++;
    }
    for(i=1;i<=N;++i)
    for(j=1;j<=N;++j)
    for(k=0;k<4;++k){
        scanf("%d",&x);
        ii=i+dx[k]; jj=j+dy[k];
        if( ii && jj && ii<=N && jj<=N ){
            v[(i-1)*N+j].pb((ii-1)*N+jj);
            C[(i-1)*N+j].pb(x);
            F[(i-1)*N+j].pb(0);
            H[(i-1)*N+j][(ii-1)*N+jj]=sz[(i-1)*N+j]++;
        }
    }
}

inline int BF(){
    int i,x,st=1,dr=1;

    memset(prev,0,sizeof(prev));
    Q[st]=S; prev[S]=-1;

    while( st<=dr ){
        x=Q[st++];
        if( x==D ) continue;

        for( i=0; i<sz[x]; ++i)
            if( !prev[v[x][i]] && C[x][i]>F[x][i] ){
                prev[v[x][i]]=x;
                Q[++dr]=v[x][i];
            }
    }

    return prev[D];
}

void flux(){
    int i,q;
    int fmin,wh;

    while( BF() )
    for(i=0; i<sz[D]; ++i)
    if( prev[v[D][i]] ){
        prev[D]=v[D][i];
        fmin=INF; vv[0]=0;

        for( wh=D; wh!=S; wh=prev[wh] ){
            vv[++vv[0]]=H[prev[wh]][wh];
            fmin=Minim(fmin, C[prev[wh]][vv[vv[0]]]-F[prev[wh]][vv[vv[0]]]);
        }

        if( !fmin ) continue;

        for( q=1,wh=D; wh!=S; wh=prev[wh] ){
            F[prev[wh]][vv[q++]] +=fmin;
            if( prev[wh] != S )
                F[wh][H[wh][prev[wh]]] -= fmin;
        }

        sol -= fmin;
    }
}

int main(){
    freopen("pixels.in","r",stdin);
    freopen("pixels.out","w",stdout);

    citire();
    flux();

    printf("%d\n",sol);
    fclose(stdin); fclose(stdout);
    return 0;
}