BZOJ1565 植物大战僵尸
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1565
这题看上去并不会做,结果又是最大权闭合子图的裸题。
于是就去看了一发论文,明白建图的技巧。
论文地址:《最小割模型在信息学竞赛中的应用》
嗯,讲这个的部分在第三章。
好了,看完论文就知道DAG的怎么搞了。
这题可能有环,因为环上的不能选,有边连到环上[被环上的点保护着的]的也不能选。
那么我们就把环弄掉,连在环上的呢?用反图,然后拓扑排序就可以同时把这两种点排除掉了。
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=;
const int maxt=;
const int INF=0x3f3f3f3f; struct Node{
int data,next,low;
}node[maxt*maxt*]; #define now node[point].data
#define then node[point].next
#define www node[point].low struct Edge{
int u,v;
}edge[maxt*maxt]; int n,m,tot,cnt;
int s,t,Idex,ans;
int indeg[maxt],stack[maxt],top;
int head[maxt],cur[maxt];
int dis[maxt],que[maxt];
int val[maxn][maxn],ind[maxn][maxn];
bool used[maxt]; void add1(int u,int v){
node[cnt].data=v;node[cnt].next=head[u];head[u]=cnt++;indeg[v]++;
edge[cnt].u=v,edge[cnt].v=u;
} void add(int u,int v,int w){
node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;head[u]=cnt++;
node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=;head[v]=cnt++;
} bool BFS(){
memset(dis,-,sizeof(dis));
int H=,T=;dis[]=;
while(H<T){
H++;
for(int point=head[que[H]];point!=-;point=then)
if(www && dis[now]<){
dis[now]=dis[que[H]]+;
que[++T]=now;
}
}
return dis[t]>;
} int dfs(int x,int low){
if(x==t) return low;
int Low;
for(int &point=cur[x];point!=-;point=then)
if(www && dis[now]==dis[x]+){
Low=dfs(now,min(low,www));
if(Low){
www-=Low;node[point^].low+=Low;
return Low;
}
}
return ;
} int main(){
#ifndef ONLINE_JUDGE
freopen("1565.in","r",stdin);
freopen("1565.out","w",stdout);
#endif
int x,y,k; scanf("%d%d",&n,&m);
t=n*m+;
for(int i=;i<t;i++) head[i]=-;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
ind[i][j]=++Idex;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d%d",&val[i][j],&k);
while(k--){
scanf("%d%d",&x,&y);
x++,y++;
add1(ind[i][j],ind[x][y]);
}
if(j!=)
add1(ind[i][j],ind[i][j-]);
}
for(int i=;i<t;i++)
if(!indeg[i]) stack[++top]=i;
while(top){
k=stack[top--],used[k]=true;
for(int point=head[k];point!=-;point=then)
if(--indeg[now]==)
stack[++top]=now;
} tot=cnt;cnt=;
for(int i=s;i<=t;i++) head[i]=-;
for(int i=;i<=tot;i++)
if(used[edge[i].u] && used[edge[i].v])
add(edge[i].u,edge[i].v,INF);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(used[ind[i][j]]){
if(val[i][j]>)
add(s,ind[i][j],val[i][j]),ans+=val[i][j];
else if(val[i][j]<)
add(ind[i][j],t,-val[i][j]);
}
int flag;
while(BFS()){
memcpy(cur,head,sizeof(cur));
while(flag=dfs(s,INF))
ans-=flag;
} printf("%d",ans);
return ;
}
BZOJ1565 植物大战僵尸的更多相关文章
- [Android] 转移“植物大战僵尸2”存档的办法,无需root
作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- 原生JS实现的h5小游戏-植物大战僵尸
代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...
- 植物大战僵尸:寻找阳光掉落Call调用
实验目标:通过遍历阳光产生的时间,寻找阳光产生的本地Call,使用代码注入器注入,自定义生成阳光 阳光CALL遍历技巧: 进入植物大战僵尸-> 当出现阳光后->马上搜索未知初始数值 返回游 ...
- java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码
Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...
- 【bzoj1565】 NOI2009—植物大战僵尸
http://www.lydsy.com/JudgeOnline/problem.php?id=1565 (题目链接) 题意 给出$n*m$的棋盘,僵尸攻击每个格子可以获得$v$的分数,每个格子又会保 ...
- 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸
dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...
- BZOJ1565: [NOI2009]植物大战僵尸
Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...
- 【BZOJ1565】 植物大战僵尸
Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...
随机推荐
- Linux安装配置php环境的方法
本文实例讲述了Linux安装配置php环境的方法.分享给大家供大家参考,具体如下: 1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.g ...
- pjax 历史管理 jQuery.History.js
更新 http://www.bootcdn.cn/jquery.pjax/ 简介 pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接.网页标题.以及 ...
- 百度分享如何自定义分享url和内容?
百度分享默认分享的是当前页的url,但也可以在同一个页面中分享多个不同的url,仅需进行如下简单的配置. 默认的代码如下: <div id="bdshare" class=& ...
- Android环境配置Sencha Touch
转自http://www.phonegap100.com/portal.php?mod=view&aid=19 作为你开发的一部分,为安卓设备开发的 Sencha Touch框架应该在安卓虚拟 ...
- 09-排序3 Insertion or Heap Sort
和前一题差不多,把归并排序换成了堆排序.要点还是每一次排序进行判断 开始犯了个错误 堆排序该用origin2 结果一直在排序origin ,误导了半天以为是逻辑错误...一直在检查逻辑 建立最大堆 排 ...
- 第三节:卸载AppDomain
AppDomain很出色的一个能力就是它允许卸载.卸载AppDomain会导致CLR卸载AppDomain中的所有程序集.还会释放AppDomain的Loader堆.为了卸载一个AppDomain,可 ...
- [terry笔记]Oracle10g/11g安装-redhat5.5
操作系统准备工作 其实真正的进入图形界面安装是简单的,只是前期的配置比较繁琐,如版本.空间.位置.软件包.用户.环境变量.内核参数,这里主要讨论前期配置. 10g与11g的单实例安装基本一样,主要区别 ...
- python datetime 时间日期处理小结
python datetime 时间日期处理小结 转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/47f340f1a85b5cb3a50f5232. ...
- SharePoint2013网站添加切换用户登录
不知道大家发现没,sharepoint2013的网站集下面没有了切换用户登陆这个选项卡,这对于我们有时候要做一些权限性的实验是不太方便的,今天我找到了一个办法解决,又实际应用了一下,感觉不错,特地来和 ...
- 宝马测试(C++实现)
测试目的:对编辑器放大,缩小性能测试. 测试资源:一匹宝马. 测试结果:良好. 实现方法:通过调用本地保存的宝马文件,逐字逐行的显示在编辑器中,并放大,缩小.对不同的符号进 ...