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. Win7下 httpRequest带证书请求https网站

    常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...

  2. GemFire 入门篇1:GemFire 是什么?

    一.GemFire是什么?   如果你了解Redis或memCached,那么恭喜,你很快就能理解GemFire是什么,没错,你可以把它理解为一个增强版的Redis,具体在哪些方面增强,我们日后慢慢聊 ...

  3. 学习c的第8天

    #include <stdio.h> int main() { char ch; printf("请输入分数等级(A,B,C,D):"); scanf("%c ...

  4. php输出utf-8格式

    header("Content-type:text/html;charset=utf-8"); 输出数据前插入以上代码,以utf-8格式输出,避免乱码

  5. 利用RecyclerView CardView实现新闻卡片样式

    引入的包: demo结构: 测试代码: News.java: package com.zzw.testcardview; import java.io.Serializable; public cla ...

  6. .NET开源工作流RoadFlow-流程设计-流转条件设置(路由)

    当一个步骤后面有多个步骤时,可以设置为根据设置条件系统自动判断该流向哪些步骤,也叫路由. roadflow没有单独的路由步骤来设置条件,流程条件通过双击连线弹出条件设置框来设置. 1.sql条件 即通 ...

  7. sqlserver中查找长时间未提交事务

    无论是有意无意,如果事务在数据库中保持打开,则它会阻塞其他进程对修改后的数据进行操作.同样,对事务日志进行备份也只会截断不活动事务的那部分事务日志,所以打开的事务会导致日志变多(甚至达到物理限制),直 ...

  8. jdbc 连接 oracle rac

    jdbc 连接 oracle rac 的连接串如下:   jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192. ...

  9. [Environment Build] Maven环境配置

    1. 下载并解压maven文件 2. 在环境变量中配置一个JAVA_HOME的变量,指向你本地的JDK 3. 在系统变量中新建一个名为:MAVEN_HOME的变量,指向你的maven解压文件的bin目 ...

  10. QTP获取系统时间并自定义格式

    function GetDateTime(Nowstr)          Dim Currentdatetime           Dim YY   'Year          Dim MM   ...