P1338 QQ农场
时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

Sandytea前段时间沉迷于QQ农场中……一天夜里,他梦见来到好友X的农场上……

描述

这个农场和游戏中略有不同。土地实际上是一个边长为N的正方形,由N*N块土地组成。
在每块土地上,都种有一种农作物。如果他选择摘取一块土地上的农作物,就能获得一个固定的利润(当然,这个利润是正数)。不同土地上的利润多半是不同的。
贪心的Sandytea本想摘取所有土地上的农作物。但是正当他准备行动时,却被告知不允许摘取了两块有公共边的土地上的作物,否则就会被主人的狗发现。
Sandytea想知道,在不被狗抓住的前提下,他能获得的最大利益是多少。

输入格式

第一行:一个整数N,表示土地是一个边长为N的正方形。
下面N行:每行N个正整数,描述了各块土地上的农作物的单位价值。

输出格式

输出一行,包含一个整数,为最大的收益。

测试样例1

输入


7 7 
54 54

输出

61

备注

数据范围:
有10分的数据满足:N≤6
另有20分的数据满足:N≤13
另有30分的数据满足:N≤50
另有40分的数据满足:N≤200
所有数据满足:每块土地上作物的价值不超过100。改编自SPOJ
 
 

题解:

把格子交替染成不同颜色(即分成两部分),这样相邻的格子颜色不同,就转化成了一个二分图匹配的问题。源点s向每个白格子连流量等于土地价值的边,黑格子向汇点t连,黑白格子之间连流量为inf的边,求最小割。

注意不要把边建重了。由于每个黑格子可能会被重复连,所以不应该在每次连黑白格子之间的边时,连黑格子到t的边

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define nn 40010 //因为是矩形,所以要n*n
#define mm 1000010
#define inf 2000000001
using namespace std;
int get()
{
int ans=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {ans=ans*10+ch-'0';ch=getchar();}
return ans*f;
}
int x[4]={1,-1,0,0},y[4]={0,0,1,-1};
int e=0,n,ss,tt,fir[nn],nxt[mm],to[mm],flow[mm],q[nn],dep[nn],f[210][210];
void add(int a,int b,int c)
{
nxt[++e]=fir[a];fir[a]=e;to[e]=b;flow[e]=c;
nxt[++e]=fir[b];fir[b]=e;to[e]=a;flow[e]=0;
}
bool il(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=n) return 1;return 0;
}
bool bfs()
{
int h=1,t=1,o;
q[1]=ss;
while(h<=t)
{
o=q[h++];
for(int i=fir[o];i;i=nxt[i])
if(flow[i]&&!dep[to[i]])
{
dep[to[i]]=dep[o]+1;
q[++t]=to[i];
}
}
if(dep[tt]) return 1;
return 0;
}
int maxflow(int s,int f)
{
if(!f||s==tt) return f; //写成了return 0
int newflow,newans=0;
for(int i=fir[s];i;i=nxt[i])
if(dep[to[i]]==dep[s]+1&&flow[i])
{
newflow=maxflow(to[i],min(f,flow[i])); //流量要和flow[i]取min
f-=newflow;
flow[i]-=newflow;
flow[((i-1)^1)+1]+=newflow;
newans+=newflow;
if(!f) break;
}
if(f>0)
dep[s]=-1; //神奇的优化
return newans;
}
int main()
{
n=get();ss=0,tt=n*n+1;
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
f[i][j]=get();
ans+=f[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if((i+j)%2)
{
add(ss,(i-1)*n+j,f[i][j]); //开始写到下一个for里面了,然后就加重了
for(int k=0;k<4;k++)
if(il(i+x[k],j+y[k]))
add((i-1)*n+j,(i+x[k]-1)*n+j+y[k],inf); //一开始在这里加了到tt的边,然后就加重了
}
else
add((i-1)*n+j,tt,f[i][j]);
dep[ss]=1;
while(bfs())
{
ans-=maxflow(ss,inf);
for(int i=1;i<=tt;i++) //算上ss、tt
dep[i]=0;
dep[ss]=1;
}
printf("%d",ans);
return 0;
}
/*
3
3 42 26
81 26 36
68 52 71 6
76 53 11 42 48 27
19 78 74 46 22 57
14 2 33 62 15 62
23 62 39 95 91 69
45 36 62 44 91 70
10 7 97 67 66 68
*/  

Tyvj-1338 QQ农场的更多相关文章

  1. 【TYVJ】1338 QQ农场(最大流+最大权闭合图)

    http://tyvj.cn/Problem_Show.aspx?id=1338 时间才排到rank7,还不快啊囧.isap我常数都写得那么小了... 最大权闭合图看我另一篇博文吧 此题很明显的模型. ...

  2. TYVJ1338 QQ农场

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Sandytea前段时间沉迷于QQ农场中……一天夜里,他梦见来到好友X的农场上…… 描述 这个农场和游戏中略有 ...

  3. 关于QQ农场牧场等曾经流行的游戏的一些见解

    大概在上上周,我偶然间打开QQ空间玩了一会QQ农牧场,玩完之后我在想,在那个年代他们为什么那么红? 我觉得可能有以下几点: 1:凭借着QQ海量的用户,可以迅速推广 2:迎合了人们爱占小便宜的心理,不过 ...

  4. UU农场平台开发 UU农场拆复利系统

    UU农场平台开发 UU农场拆复利系统今年比较新的一款游戏,类似于QQ农场,但又加入了很多新型的互联网理财模式!UU农场平台开发 UU农场拆复利系统.UU农场开发.UU农场游戏平台开发.UU农场平台开发 ...

  5. 游戏全区全服和分区分服 QQ斗地主的设计

    游戏全区全服和分区分服  QQ斗地主的设计 https://cloud.tencent.com/community/article/164816001481011910?fromSource=gwzc ...

  6. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  7. 2014年5月份第1周51Aspx源码发布详情

    郑州某高校学生考评系统源码  2014-5-5 [VS2008]功能介绍:   1.用户角色有部主任.教师.学生等.   2.可添加班级考评项目.学生考评项目.   3.可指定学生对班级.学生某考评项 ...

  8. Java NIO教程 前言

    阅读本文前,建议你先了解 旧I/O NIO 是 New I/O 的缩写,要了解它真正的内涵,需要掌握的知识还是比较多的.我努力在这几篇笔记里,勾勒出整个io的面貌.为大家的深入学习铺路. I/O简史 ...

  9. 制作便携版 FireFox 火狐浏览器

    Firefox是一款可高度自定义的开源浏览器: 你可以访问 火狐DIY 定制自己的Firefox安装包, 此外,你还可以自己动手定制一款可以放在U盘随身携带的便携版Firefox火狐浏览器. 制作便携 ...

随机推荐

  1. 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]

    P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1 ...

  2. ubuntu安装django

    sudo apt-get install python-django -y#django操作mysql数据库时还需要安装python-mysqldb驱动,当然mysql安装是必须的前提 sudo ap ...

  3. Poj 1182种类(带权)并查集

    题目链接 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44316 Accepted: 12934 Descriptio ...

  4. TypeScript类型检查机制

    类型推断 指不需要指定变量的类型,TS编译器可以根据某些规则自动推断出类型. 什么时候会有类型推断? 声明变量时没有指定类型 函数默认参数 函数返回值 ...... let a; // 这时自动推断为 ...

  5. Codeforces Round #275 (Div. 2) A. Counterexample【数论/最大公约数】

    A. Counterexample time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  6. vue自定义全局公共函数

    单独零散的函数 在main.js里进行全局注册 Vue.prototype.ajax = function (){} 在所有组件里可调用 this.ajax() 多个函数定义在一个对象里 // xx. ...

  7. HTML小技巧:按钮中的文字换行 .

    一般按钮的文字都是一行的.但是有的时候画面需要按钮中的文字换行. 刚开始有个开发人员说没法实现.\r\n 都用过了没有效果.其实google这个老师是非常强大的. 直接换行的方法:<input ...

  8. IE下的双外边距浮动bug

    最常见且最容易发现的额一个bug是IE 6和最低版本中的双外边距浮动bug.这个bug是任何浮动元素上的外边距加倍. 上面代码中,div盒子向左边浮动,设置的margin-left的值是10px.在c ...

  9. IDEA(JAVA)使用json

    首先介绍一下json SON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的 ...

  10. 如何用好消息推送(push)做APP运营

    作为移动端APP产品运营最重要的运营手段,消息推送(push)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用 ...