bzoj3774: 最优选择

来源:互联网 发布:苹果最新软件源 编辑:程序博客网 时间:2024/06/06 17:44
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;#define INF 0x3f3f3f3f#define maxn 222222int n,m;int a[100][100],b[100][100];int dx[]={0,0,1,-1};int dy[]={1,-1,0,0};struct node{    int v,f;}e[maxn];int q[maxn],next[maxn],first[maxn],S,T,vis[11000],en;inline int enc(int x,int y,bool b){return (x-1)*m+y+b*m*n;}void init(){    memset(first,-1,sizeof(first));    en=-1;    S=m*n*2+1;    T=S+1;}void add(int a,int b,int c){    en++;    e[en].v=b;    e[en].f=c;    next[en]=first[a];    first[a]=en;    en++;    e[en].v=a;    e[en].f=0;    next[en]=first[b];    first[b]=en;}void build(){    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if((i+j)&1)            {                add(S,enc(i,j,0),a[i][j]);                add(enc(i,j,0),enc(i,j,1),b[i][j]);            }            else            {                add(enc(i,j,0),T,a[i][j]);                add(enc(i,j,1),enc(i,j,0),b[i][j]);            }            for(int k=0;k<4;k++)            {                int xx=i+dx[k],yy=j+dy[k];                if(xx<1||xx>n||yy<1||yy>m) continue;                if((i+j)&1) add(enc(i,j,1),enc(xx,yy,0),INF);                else add(enc(xx,yy,0),enc(i,j,1),INF);            }        }    }    return ;}bool bfs(){    int head=0,tail=1;    q[1]=S;    memset(vis,-1,sizeof(vis));    vis[S]=0;    while(head<tail)    {        head++;        int now=q[head];        for(int i=first[now];~i;i=next[i])        {            if(e[i].f==0||vis[e[i].v]!=-1) continue;            vis[e[i].v]=vis[now]+1;            if(e[i].v==T) return true;            tail++;            q[tail]=e[i].v;        }    }    return false;}int dfs(int x,int f){    if(x==T||f==0) return f;    int flow=0,tmp;    for(int i=first[x];~i;i=next[i])    {        if(e[i].f==0||vis[e[i].v]!=vis[x]+1) continue;        tmp=dfs(e[i].v,min(f,e[i].f));        if(tmp)        {            flow+=tmp;            e[i].f-=tmp;            e[i^1].f+=tmp;            f-=tmp;        }        if(!f) break;    }    if(!flow) vis[x]=-1;    return flow;}int dinic(){    int maxflow=0,tmp=0;    while(bfs())    {        while(tmp=dfs(S,INF)) maxflow+=tmp;    }    return maxflow;}int main(){    scanf("%d%d",&n,&m);    init();    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            scanf("%d",&a[i][j]);        }    }    int ans=0;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            scanf("%d",&b[i][j]);            ans+=b[i][j];        }    }    build();    printf("%d\n",ans-dinic());    return 0;}


0 0
原创粉丝点击