410. [NOI2009] 植物大战僵尸

★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比
时间限制:2 s   内存限制:512 MB

【问题描述】

Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏。Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻。该款游戏包含多种不同的挑战系列,比如Protect Your Brain、Bowling等等。其中最为经典的,莫过于玩家通过控制Plants来防守Zombies的进攻,或者相反地由玩家通过控制Zombies对Plants发起进攻。

现在,我们将要考虑的问题是游戏中Zombies对Plants的进攻,请注意,本题中规则与实际游戏有所不同。游戏中有两种角色,Plants和Zombies,每个Plant有一个攻击位置集合,它可以对这些位置进行保护;而Zombie进攻植物的方式是走到植物所在的位置上并将其吃掉。

游戏的地图可以抽象为一个N行M列的矩阵,行从上到下用0到N–1编号,列从左到右用0到M–1编号;在地图的每个位置上都放有一个Plant,为简单起见,我们把位于第r行第c列的植物记为Pr,c。

Plants分很多种,有攻击类、防守类和经济类等等。为了简单的描述每个Plant,定义Score和Attack如下:

Score[Pr,c]

Zombie击溃植物Pr,c可获得的能源。若Score[Pr,c]为非负整数,则表示击溃植物Pr,c可获得能源Score[Pr,c],若为负数表示击溃Pr,c需要付出能源-Score[Pr,c]。

Attack[Pr,c]

植物Pr,c能够对Zombie进行攻击的位置集合。

Zombies必须从地图的右侧进入,且只能沿着水平方向进行移动。Zombies攻击植物的唯一方式就是走到该植物所在的位置并将植物吃掉。因此Zombies的进攻总是从地图的右侧开始。也就是说,对于第r行的进攻,Zombies必须首先攻击Pr,M-1;若需要对Pr,c(0≤c<M-1)攻击,必须将Pr,M-1,Pr,M-2…Pr,c+1先击溃,并移动到位置(r,c)才可进行攻击。

在本题的设定中,Plants的攻击力是无穷大的,一旦Zombie进入某个Plant的攻击位置,该Zombie会被瞬间消灭,而该Zombie没有时间进行任何攻击操作。因此,即便Zombie进入了一个Plant所在的位置,但该位置属于其他植物的攻击位置集合,则Zombie会被瞬间消灭而所在位置的植物则安然无恙(在我们的设定中,Plant的攻击位置不包含自身所在位置,否则你就不可能击溃它了)。

Zombies的目标是对Plants的阵地发起进攻并获得最大的能源收入。每一次,你可以选择一个可进攻的植物进行攻击。本题的目标为,制定一套Zombies的进攻方案,选择进攻哪些植物以及进攻的顺序,从而获得最大的能源收入。

【输入文件】

输入文件pvz.in的第一行包含两个整数N,M,分别表示地图的行数和列数。

接下来N×M行描述每个位置上植物的信息。第r×M+c+ 1行按照如下格式给出植物Pr,c的信息:第一个整数为Score[Pr,c],第二个整数为集合Attack[Pr,c]中的位置个数w,接下来w个位置信息(r’,c’),表示Pr,c可以攻击位置第r’行第c’列。

【输出文件】

输出文件pvz.out仅包含一个整数,表示可以获得的最大能源收入。注意,你也可以选择不进行任何攻击,这样能源收入为0。

【输入样例】

3 2

10 0

20 0

-10 0

-5 1 0 0

100 1 2 1

100 0

【输出样例】

25

【样例说明】

在样例中,植物P1,1可以攻击位置(0,0),P2, 0可以攻击位置(2,1)。

一个方案为,首先进攻P1,1,P0,1,此时可以攻击P0,0。共得到能源收益为(-5)+20+10 = 25。注意,位置(2,1)被植物P2,0保护,所以无法攻击第2行中的任何植物。

【大致数据规模】

约20%的数据满足1 ≤N,M≤ 5;

约40%的数据满足1 ≤N,M≤ 10;

约100%的数据满足1 ≤N≤ 20,1 ≤M≤ 30,-10000 ≤Score≤ 10000

  先看看最大权闭合子图再来做这道题吧。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxr=,maxc=;
const int maxn=;
const int maxm=;
const int INF=;
int R,C,id[maxr][maxc],def[maxr*maxc],G[maxr*maxc][maxr*maxc],sum;
int cnt=,fir[maxn],nxt[maxm<<],to[maxm<<],cap[maxm<<],v[maxr][maxc];
void addedge(int a,int b,int c){
nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;cap[cnt]=c;
}
int dis[maxn],gap[maxn],path[maxn],fron[maxn];
queue<int>q;
void BFS(){
memset(dis,,sizeof(dis));
dis[R*C+]=;q.push(R*C+);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=fir[x];i;i=nxt[i])
if(!dis[to[i]]&&!def[to[i]])
dis[to[i]]=dis[x]+,
q.push(to[i]);
}
}
int ISAP(){
BFS();
for(int i=;i<=R*C+;i++){
gap[dis[i]]++;
fron[i]=fir[i];
}
int p=,f,ret=;
while(dis[]<=R*C+){
if(p==R*C+){
f=INF;
while(p){
f=min(f,cap[path[p]]);
p=to[path[p]^];
}
p=R*C+;ret+=f;
while(p){
cap[path[p]]-=f;
cap[path[p]^]+=f;
p=to[path[p]^];
}
}
int &ii=fron[p];
for(;ii;ii=nxt[ii])
if(cap[ii]&&dis[to[ii]]==dis[p]-&&!def[to[ii]])
break;
if(ii)
path[p=to[ii]]=ii;
else{
if(--gap[dis[p]]==)break;
int Min=R*C+;
for(int i=fir[p];i;i=nxt[i])
if(cap[i]&&!def[to[i]])
Min=min(Min,dis[to[i]]);
++gap[dis[p]=Min+];
fron[p]=fir[p];
if(p)p=to[path[p]^];
}
}
return ret;
}
void DFS(int x){
for(int i=;i<=R*C;i++)
if(!def[i]&&G[x][i]){
def[i]=true;
DFS(i);
}
}
int main(){
freopen("pvz.in","r",stdin);
freopen("pvz.out","w",stdout);
scanf("%d%d",&R,&C);
for(int i=;i<=R;i++)
for(int j=;j<=C;j++)
id[i][j]=(i-)*C+j;
for(int i=;i<=R;i++)
for(int j=,x,a,b;j<=C;j++){
scanf("%d%d",&v[i][j],&x);
while(x--){
scanf("%d%d",&a,&b);a++;b++;
G[id[i][j]][id[a][b]]=true;
addedge(id[a][b],id[i][j],INF);
addedge(id[i][j],id[a][b],);
}
if(j>){
G[id[i][j]][id[i][j-]]=true;
addedge(id[i][j-],id[i][j],INF);
addedge(id[i][j],id[i][j-],);
}
} for(int k=;k<=R*C;k++)
for(int i=;i<=R*C;i++)
for(int j=;j<=R*C;j++)
G[i][j]|=G[i][k]&&G[k][j]; for(int i=;i<=R*C;i++)
if(G[i][i])
def[i]=true; for(int i=;i<=R*C;i++)
if(def[i])
DFS(i); for(int i=;i<=R;i++)
for(int j=;j<=C;j++)
if(!def[id[i][j]]){
if(v[i][j]>){
sum+=v[i][j];
addedge(,id[i][j],v[i][j]);
addedge(id[i][j],,);
}
else
addedge(id[i][j],R*C+,-v[i][j]),
addedge(R*C+,id[i][j],);
} printf("%d\n",sum-ISAP());
return ;
}

图论(网络流):COGS 410. [NOI2009] 植物大战僵尸的更多相关文章

  1. COGS410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  2. P2805 [NOI2009]植物大战僵尸

    题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...

  3. BZOJ 1565: [NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 1071[Submit][Stat ...

  4. 【刷题】BZOJ 1565 [NOI2009]植物大战僵尸

    Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻. ...

  5. 【bzoj1565】[NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2164  Solved: 1001[Submit][Stat ...

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

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

  7. BZOJ1565——[NOI2009]植物大战僵尸

    1.题意:有一些点,点与点之间有保护关系,每个点都有一个权值,求能获得的最大值 2.分析:裸的最大权闭合图,用网络流进行求解,然后我们发现点与点之间的保护关系可能构成环,这样网络流是无法处理的,然后我 ...

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

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

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

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

随机推荐

  1. 10.23 noip模拟试题

    尼玛蛋pdf好难粘 直接写了 T1 /*开始写wa了 我真弱2333 关于p的排序规则不只是差值 为了字典序最小 还要拍别的*/ #include<cstdio> #include< ...

  2. List(列表)

    List(列表): List的特征是其元素以线性方式存储,集合中可以存放重复对象. List接口主要实现类包括: ArrayList() : 代表长度可以改变得数组.可以对元素进行随机的访问,向Arr ...

  3. HTML5 WebAudioAPI(三)--绘制频谱图

    HTML <style> #canvas { background: black; } </style> <div class="container" ...

  4. IsPostBack and DropdownList.

    Encounted the issue accident when helping my classmate dealing with his homework assignment,it turns ...

  5. winows8.1或winows7 64bit 安装Itunes 64bit 11.1.3 无法打开一直停止工作的解决办法

    winows8.1或winows7 64bit 安装Itunes 64bit 11.1.3 无法打开一直停止工作的解决办法 系统环境变量里的Path追加 ;C:\program files (x86) ...

  6. xcode本地运行H5游戏可以吗?

    答案是不可以!!! 不可以!!! 不可以!!! 有时候很郁闷的接受一个需求,然后以为自己能力不行,或者是代码写错,还是哪里了解不够,然而并不是啊!!! MD的我想说有些事是行不通的的!! 好了,平静下 ...

  7. PHP 数组转JSON数据(convert array to JSON object);

    <?php header('Content-type: appliction/json; charset=shift-JIS'); $data =array(); class Test { pu ...

  8. Java实现Linux下服务器程序的双守护进程

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问 ...

  9. Mac OS X 开启SSH服务

    系统偏好设置-->共享 没解锁的解个锁 选中远程登录&允许所有用户 若要远程登录这台电脑, 请键入 ssh 要登录的用户名@ip地址或电脑名,例:ssh zhanghua@applede ...

  10. php微信支付接口开发程序

    php微信支付接口开发程序讲解 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了, 下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考. ...