tyvj1338 QQ农场
背景
Sandytea前段时间沉迷于QQ农场中……一天夜里,他梦见来到好友X的农场上……
描述
这个农场和游戏中略有不同。土地实际上是一个边长为N的正方形,由N*N块土地组成。
在每块土地上,都种有一种农作物。如果他选择摘取一块土地上的农作物,就能获得一个固定的利润(当然,这个利润是正数)。不同土地上的利润多半是不同的。
贪心的Sandytea本想摘取所有土地上的农作物。但是正当他准备行动时,却被告知不允许摘取了两块有公共边的土地上的作物,否则就会被主人的狗发现。
Sandytea想知道,在不被狗抓住的前提下,他能获得的最大利益是多少。
在每块土地上,都种有一种农作物。如果他选择摘取一块土地上的农作物,就能获得一个固定的利润(当然,这个利润是正数)。不同土地上的利润多半是不同的。
贪心的Sandytea本想摘取所有土地上的农作物。但是正当他准备行动时,却被告知不允许摘取了两块有公共边的土地上的作物,否则就会被主人的狗发现。
Sandytea想知道,在不被狗抓住的前提下,他能获得的最大利益是多少。
输入格式
第一行:一个整数N,表示土地是一个边长为N的正方形。
下面N行:每行N个正整数,描述了各块土地上的农作物的单位价值。
下面N行:每行N个正整数,描述了各块土地上的农作物的单位价值。
输出格式
输出一行,包含一个整数,为最大的收益。
测试样例1
输入
2
7 7
54 54
输出
61
备注
数据范围:
有10分的数据满足:N≤6
另有20分的数据满足:N≤13
另有30分的数据满足:N≤50
另有40分的数据满足:N≤200
所有数据满足:每块土地上作物的价值不超过100。改编自SPOJ
有10分的数据满足:N≤6
另有20分的数据满足:N≤13
另有30分的数据满足:N≤50
另有40分的数据满足:N≤200
所有数据满足:每块土地上作物的价值不超过100。改编自SPOJ
最小割 网络流
//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn=200*200+10,maxm=4*maxn+maxn,INF=100; int n,k,S,T,tot; bool pl[maxn];int v[maxn]; int aa;char cc; int read() { aa=0;cc=getchar(); while(cc<'0'||cc>'9') cc=getchar(); while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar(); return aa; } struct Node{ int x,y,cap,flow; }node[2*maxm]; int cur[maxn]; int fir[maxn],nxt[2*maxm],e=1; void add(int x,int y,int z) { node[++e].x=x;node[e].y=y;node[e].cap=z; nxt[e]=fir[x];fir[x]=e; node[++e].x=y;node[e].y=x;node[e].cap=0; nxt[e]=fir[y];fir[y]=e; } int zz[maxn],dis[maxn],s=1,t=0; bool BFS() { memset(dis,-1,sizeof(dis)); dis[S]=0; s=1,t=0;zz[++t]=S; int x,y; while(s<=t) { x=zz[s];s++; for(y=fir[x];y;y=nxt[y]) { if(node[y].flow>=node[y].cap||dis[node[y].y]!=-1) continue; dis[node[y].y]=dis[x]+1; zz[++t]=node[y].y; } } return dis[T]!=-1; } int DFS(int pos,int maxf) { if(pos==T||!maxf) return maxf; int rs=0,now; for(int &y=cur[pos];y;y=nxt[y]) { if(node[y].flow>=node[y].cap||dis[node[y].y]!=dis[node[y].x]+1) continue; now=DFS(node[y].y,min(maxf,node[y].cap-node[y].flow)); node[y].flow+=now; node[y^1].flow-=now; rs+=now; maxf-=now; } if(!rs) dis[pos]=-1; return rs; } int Dinic() { int rs=0; while(BFS()) { memcpy(cur,fir,sizeof(fir)); rs+=DFS(S,0x3f3f3f3f); } return rs; } int main() { n=read();tot=n*n; int x,y; S=tot+1;T=S+1; tot=0; for(int i=1;i<=n*n;++i) v[i]=read(),tot+=v[i]; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { x=(i-1)*n+j; if(pl[x]) continue; if((i+j)%2==0) add(S,x,v[x]); else add(x,T,v[x]); if(i!=n) { if((i+j)%2==0) add(x,x+n,INF); else add(x+n,x,INF); } if(j!=n) { if((i+j)%2==0) add(x,x+1,INF); else add(x+1,x,INF); } } printf("%d",tot-Dinic()); return 0; }
弱者就是会被欺负呀