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 植物大战僵尸的更多相关文章

  1. [Android] 转移“植物大战僵尸2”存档的办法,无需root

    作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...

  2. 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

    32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...

  3. 原生JS实现的h5小游戏-植物大战僵尸

    代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...

  4. 植物大战僵尸:寻找阳光掉落Call调用

    实验目标:通过遍历阳光产生的时间,寻找阳光产生的本地Call,使用代码注入器注入,自定义生成阳光 阳光CALL遍历技巧: 进入植物大战僵尸-> 当出现阳光后->马上搜索未知初始数值 返回游 ...

  5. java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  6. 【bzoj1565】 NOI2009—植物大战僵尸

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 (题目链接) 题意 给出$n*m$的棋盘,僵尸攻击每个格子可以获得$v$的分数,每个格子又会保 ...

  7. 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸

    dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...

  8. BZOJ1565: [NOI2009]植物大战僵尸

    Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...

  9. 【BZOJ1565】 植物大战僵尸

    Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 ...

随机推荐

  1. 【转】8种Nosql数据库系统对比

    导读:Kristóf Kovács 是一位软件架构师和咨询顾问,他最近发布了一片对比各种类型nosql数据库的文章.文章由敏捷翻译 – 唐尤华编译.如需转载,请参见文后声明. 虽然SQL数据库是非常有 ...

  2. appcan weixin 开发

    登录微信开放平台:https://open.weixin.qq.com/ 管理中心,创建移动应用,ps:创建应用需要审核,其中 应用包名 需与在线打包安卓时候的  自定义包名一致. 开放平台 应用申请 ...

  3. 在Javascript操作JSON对象,增加 删除 修改

    在Javascript操作JSON对象,增加删除修改全有的,详情见代码 <script type="text/javascript"> var jsonObj2 = { ...

  4. C# 委托简单使用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. C#创建、读取和修改Excel

    // Namespaces, Variables, and Constants using System; using System.Configuration; using System.Data; ...

  6. Linux查看文件以及文件夹的大小

    df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.du可以查看文件及文件夹的大小. df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子: df命令可以查 ...

  7. hdu 4715 Difference Between Primes

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Description All you kn ...

  8. js判断小数点几位

    js如何判断小数点后有几位 <script> var n=3.143423423;alert(n.toString().split(".")[1].length); & ...

  9. ios学习笔记之block在ios开发中的应用

    一.什么是Blocks      Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...

  10. wordpress 为文章内容添加自动过滤,例如为出站链接添加nofollow,也可以将淘宝客链接转换。。

    做seo的都明白,反向链接对与网站的优化有着很重要的作用,是搜索引擎给网站排名的一个重要因素.为了添加反向链接,SEO作弊者会在论坛和博客等大量发布带无关链接的 内容.这些垃圾链接的存在给搜索引擎对网 ...